首页 新闻 会员 周边

JavaScript闭包作用域问题,JS大神进!

0
悬赏园豆:30 [已解决问题] 解决于 2017-09-18 18:37
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());

这一段返回的为什么是 The Window,子函数找变量不是一级一级网上找吗,找的不应该是My Object吗?

 

然后这一段

 var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()());

返回的是My Object,这里面的var that = this改变了指向吗,这里的That是哪个对象?

求JS大神详细解答,可加分!!!

Lawliet__zmz的主页 Lawliet__zmz | 初学一级 | 园豆:4
提问于:2017-09-18 14:57
< >
分享
最佳答案
-1

匿名函数的this一般都是window。

第一段代码 getNameFunc 对应的function的this指向object,但该函数返回了另外一个函数,函数是匿名的(this指向window)

第二段代码中通过闭包,让匿名函数引用getNameFunc 的局部变量that(其实是getNameFunc 的this)

匿名函数执行寻找that变量时,它自己是没有这个变量的,就向上找that,这时的that,引用的是getNameFunc 的this,也就是object。

收获园豆:11
codingHeart | 小虾三级 |园豆:1511 | 2017-09-18 16:40
其他回答(3)
-1

全局作用域内定义的变量可以在全局和函数体内访问,函数作用域内定义的变量只能在自己的函数作用域内访问。如果变量前没有加var,无论在哪定义都会成为全局变量

LLSmile | 园豆:257 (菜鸟二级) | 2017-09-18 15:00

不要复制粘贴

支持(0) 反对(1) Lawliet__zmz | 园豆:4 (初学一级) | 2017-09-18 16:21
0

在 getNameFunc 方法里面 this 指向的是 object,因为这些一个对象的方法,

而更里面 return 的那个 function 里面 this 指向的是全局对象,因为这个 function 是个普通调用的函数,它不是 object 的方法

具体来说你需要了解在各种情况下函数调用时 this 的指向问题

收获园豆:11
by.Genesis | 园豆:2719 (老鸟四级) | 2017-09-18 15:44
0

我来解释一下吧,如果有不对的地方欢迎指出,大家都是学习。

首先对于this,只要记住一点,不论怎样,this总是指向调用函数的那个对象。这样就比较简单了。

第一个函数,alert(object.getNameFunc()())  注意:object.getNameFunc() = return 的匿名函数,假设该匿名函数的名字为zhang,那么上面这句话就是 alert(zhang()) 很显然,调用这个函数的对象是window.

第二个函数,看this指的是什么,object.getNameFunc(),调用的对象是object,所以这个this指的就是object。接着就更简单了,返回的匿名函数使用了什么,that,that等于什么,this,this是什么,object。

最后,对于函数的this指针,只要记住this总是指向调用函数的那个对象,一切OK。

收获园豆:8
铁柱成针 | 园豆:614 (小虾三级) | 2017-09-18 17:36

"很显然" ,不要用这个词吧。。。

上面两位讲清楚了,你也讲的不错

支持(0) 反对(0) Lawliet__zmz | 园豆:4 (初学一级) | 2017-09-18 18:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册