this
是一个引用类型,指向调用者
function testCallback(){ if(this === window){ console.log("this === window"); }else if(this === document){ console.log("this === document"); }else if(this === a){ console.log("this === a"); } } testCallback(); //this===window document.onclick = testCallback; //this === document var a = {}; a.callback = testCallback; a.callback(); //this === a
上述三种最简单的情况,应该也算是我们最常见的了吧。说是三种,其实也只能算是两种吧,因为document.onclick
和a.callback
的两种,其实质是相同的,只是对象名和属性名是不同的。
所以,我们可以先根据上面的情况,把this
的指向,定义为两种:
1:一种是如果显示的在一个对象上直接调用了一个方法,那么其中的this就是指向这个显示的对象。
2:第二种是,如果没有显示的调用的话,比如之前代码中,直接使用testCallback()
执行函数,那么其中的this
,就是指向window
对象。
3:在函数内部使用,用来引用包含函数的对象,而不是函数本身。
为什么没有显示的对象调用时,this
是指向window
对象呢?记得我们在最初学习JS
时有过这样的描述吧,如果没有使用var
定义一个变量,即便是在局部作用域定义,这也是一个全局变量,而全局变量是会被添加到window
对象中,作为其中的一个属性的,所以,之前的testCallback
方法,其实是存在于window
对象中的一个方法。所以,这里不算是显示调用,但是如果把这种调用方法写的完全的话,应该是window.testCallback()
写法,所以,按照显示调用的说法,也是正确。