为了账号安全,请及时绑定邮箱和手机立即绑定

js闭包题目求解

js闭包题目求解

aluckdog 2019-02-19 17:19:24
var obj = {    a:3,    b:function(){        console.log(this,1);        var that = this;        var s = function(){            console.log(this,2);            console.log(that,3);        }        return s;    }}obj.b()();来,求大神解释一下,为什么第二个输出是全局对象。this不应该访问的是父级内的this么?继续再追问一下var obj = {    a:3,    b:function(){        console.log(this,1);        var that = this;        var s = function(){            console.log(this,2);            console.log(that,3);        }        s();    }}obj.b();这种情况下,2为什么也是window呢?
查看完整描述

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被调用的,仅此而已。


查看完整回答
反对 回复 2019-02-26
  • 1 回答
  • 0 关注
  • 353 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信