this

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.onclicka.callback的两种,其实质是相同的,只是对象名和属性名是不同的。

所以,我们可以先根据上面的情况,把this的指向,定义为两种:

1:一种是如果显示的在一个对象上直接调用了一个方法,那么其中的this就是指向这个显示的对象。

2:第二种是,如果没有显示的调用的话,比如之前代码中,直接使用testCallback()执行函数,那么其中的this,就是指向window对象。

3:在函数内部使用,用来引用包含函数的对象,而不是函数本身。

为什么没有显示的对象调用时,this是指向window对象呢?记得我们在最初学习JS时有过这样的描述吧,如果没有使用var定义一个变量,即便是在局部作用域定义,这也是一个全局变量,而全局变量是会被添加到window对象中,作为其中的一个属性的,所以,之前的testCallback方法,其实是存在于window对象中的一个方法。所以,这里不算是显示调用,但是如果把这种调用方法写的完全的话,应该是window.testCallback()写法,所以,按照显示调用的说法,也是正确。

原文地址:https://www.cnblogs.com/caroline4lc/p/4821603.html