1 回答
TA贡献2041条经验 获得超4个赞
其实这里就是this的隐式丢失了。
一个隐式丢失的过程是这样子的:
var obj = {
a: function() {
console.log(this);
}
};
obj.a(); //作为对象的方法使用,隐式绑定,this为这个对象。
var b = obj.a
b(); //赋给一个变量,发生隐式丢失,this指向window。
可以这样理解,this词法是跟调用的方式有关的,当调用obj.a()的时候,这个函数是基于obj对象来调用的,它作为对象的方法来调用,所以很显然this指向obj。
而var b = obj.a其实就等价于:
var b = function() {
console.log(this);
}
于是当你调用b的时候,这是对b的直接调用,故指向window。
所以再看回你的代码。
当你return了一个函数时,这里创建了一个闭包,that保存了对词法作用域的引用。
这个时候,obj.b()就等价于
function s() {
console.log(this,2);
console.log(that,3);
}
又因为创建了闭包,所以that能够访问得到原来的词法作用域。但是这里的this跟函数调用的方法有关,它相当于直接调用了一个s函数,所以this自然指向window。
你可以去看下《你不知道的JS(上卷)》,里面this一节讲得十分清楚。
补充第二段代码解释:
其实这就是对函数的独立调用,默认绑定到了window对象上面。
刚刚的说法有点小错误。
this词法与函数调用的位置和调用的方式有关。
一般情况下,都是先找到函数调用的位置,再判断调用的方式。按照你的代码,其实就是两种方式。
一种是默认绑定,就是对函数的独立调用,指向window,严格模式下指向的是undefined。
一种是隐式绑定,就是作为对象的方法去调用。但是这种情况很多时候会出现隐式丢失。
综上,第一段代码,就是隐式丢失的情况。第二段代码,仅仅只是对于函数的独立调用,虽然是在obj中的b被调用的,仅此而已。
添加回答
举报