在JavaScript中,this是非常复杂的。这一节我们只针对this在事件操作中的使用情况进行介绍,而对于this在其他场合(如面向对象开发等)的使用,我们在JavaScript进阶部分再详细讲解。
在事件操作中,可以这样理解:哪个DOM对象(元素节点)调用了this所在的函数,那么this指向的就是哪个DOM对象。
举例:
<!DOCTYPE html> 
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script>
        window.onload = function () 
        {
            var oDiv = document.getElementsByTagName("div")[0];
            oDiv.onclick = function () 
            {
                this.style.color = "hotpink";
            }
        }
    </script>
</head>
<body>
    <div>绿叶,给你初恋般的感觉~</div>
</body>
</html>
浏览器预览效果如图所示。

分析:
this所在的函数是一个匿名函数,然后这个匿名函数被oDiv调用了,因此this指向的就是oDiv。
这里,this.style.color = "hotpink";等价于oDiv.style.color = "hotpink";,我们可以自行测试一下。
举例:
<!DOCTYPE html> 
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script>
        window.onload = function () 
        {
            var oDiv = document.getElementsByTagName("div")[0];
            oDiv.onclick = changeColor;
            function changeColor()
            {
                this.style.color = "hotpink";
            }
        }
    </script>
</head>
<body>
    <div>绿叶,给你初恋般的感觉~</div>
</body>
</html>
浏览器预览效果如图所示。

分析:
this所在的函数是changeColor,然后changeColor函数被oDiv调用了,因此this指向的就是oDiv。事实上,上面两个例子是等价的。
举例:
<!DOCTYPE html> 
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script>
        window.onload = function () 
        {
            var oDiv = document.getElementsByTagName("div")[0];
            var oP = document.getElementsByTagName("p")[0];
            oDiv.onclick = changeColor;
            oP.onclick = changeColor;
            function changeColor()
            {
                this.style.color = "hotpink";
            }
        }
    </script>
</head>
<body>
    <div>绿叶,给你初恋般的感觉~</div>
    <p>绿叶,给你初恋般的感觉~</p>
</body>
</html>
浏览器预览效果如图所示。

分析:
这里changeColor()函数被两个元素节点调用,那它究竟指向的是哪一个呢?其实this只有在被调用的时候才确定下来的。当我们点击div元素时,此时this所在的函数changeColor被div元素调用,因此this指向的是div元素。当我们点击p元素时,此时this所在的函数changeColor被p元素调用,因此this指向的是p元素。
总而言之一句话:哪个DOM对象(元素节点)调用了this所在的函数,那么this指向的就是哪个DOM对象。
举例:
<!DOCTYPE html> 
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script>
        window.onload = function () 
        {
            var oUl = document.getElementById("list");
            var oLi = oUl.getElementsByTagName("li");
            for (var i = 0; i < oLi.length; i++) 
            {
                oLi[i].onclick = function () 
                {
                    oLi[i].style.color = "hotpink";
                }
            }
        }
    </script>
</head>
<body>
    <ul id="list">
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
    </ul>
</body>
</html>
浏览器预览效果如图所示。

分析:
一开始想要实现的效果是:点击哪一个li元素,就改变这个li元素的颜色。很多人自然而然就写下了上面这种代码。然后测试的时候,会发现完全没有效果。这是怎么回事呢?我们试着把oLi[i].style.color = "hotpink";这一句换成this.style.color = "hotpink";就有效果了。
那么为什么用oLi[i]就不正确,而必须要用this呢?其实这就是典型的闭包问题。对于闭包,我们在JavaScript进阶中再详细介绍。
在事件函数中,想要使用当前元素节点,我们尽量使用this来代替oBtn、oLi[i]等等这种DOM对象的写法。
