首页 新闻 会员 周边

有关js闭包问题

0
悬赏园豆:15 [已解决问题] 解决于 2014-03-17 19:46

因为在整理梳理闭包,看到这段代码,有两个问题:

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

① 输出The Window的原因是什么?~不是应该输出My Object吗?~this不是对象字面量object的作用域么;

②因为有了第一问,所以我把代码写在html文档中看看输出结果,代码如下(因为是测试用的,所以尽量简单):

<!doctype html>
<html>
    <head></head>
    <script>
        window.onload = (function() {
        var name = "The Window";   
      var object = {   
        name : "My Object",   
        getNameFunc : function(){   
          return function(){   
            return this.name;   
         };   
        }   
        };   
        alert(object.getNameFunc()()); 
    });
    </script>
    <body>
        
    </body>
</html>

弹出来的是一个没有内容的提示框。=。=这就奇怪了,难道window.onload用的不对吗?

gyy_Jade的主页 gyy_Jade | 初学一级 | 园豆:111
提问于:2014-03-15 20:32
< >
分享
最佳答案
1
alert(object.getNameFunc()());  //The Window

等价于:

alert(function(){return this.name}());

这个时候的this,指代的是window对象,那么返回的就是window.name,所以提示'The Window'。

至于第二个问题,你直接console.log(window.name);console.log(window.name1),看结果就明白了。window自带一个name属性,只能说你取的名字刚好一致了。

收获园豆:5
幻天芒 | 高人七级 |园豆:37175 | 2014-03-16 20:26
其他回答(2)
0

最终返回的是一个方法 object.getNameFunc()() ,后一对"()"执行了此方法:return了this.name ,此时的 this 是 window 对象,此时你会疑问怎么弹出的内容不是undefined 。 这里就要注意一点 window.name 具体知识可自行查阅

收获园豆:5
yyutudou | 园豆:997 (小虾三级) | 2014-03-15 22:34

谢谢你的回答~不过,我疑问的不是“弹出的内容不是undefined ”,而是它根本没有内容弹出来,测试环境时chrome 30.0.1599.101 m

支持(0) 反对(0) gyy_Jade | 园豆:111 (初学一级) | 2014-03-15 22:43

@Iwillknow: 已经说了嘛,return this.name中的this是window对象,window对象中有一个默认为空的name属性

支持(0) 反对(0) yyutudou | 园豆:997 (小虾三级) | 2014-03-15 23:01

@yuyangtudou: 我懂你的意思^_^~不过呢,我还想请教你,对于”var name = "The Window";”这应该算是全局变量,而对于全局变量那不都是挂在window对象下的吗?混乱了=。=

支持(0) 反对(0) gyy_Jade | 园豆:111 (初学一级) | 2014-03-16 00:04

@Iwillknow: 本身是全局的,不过在第二段代码中,你是写在function内部的,所以这个name的作用域就被改变了。就不再挂在window下了。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-03-16 20:30

@幻天芒: 谢谢

支持(0) 反对(0) gyy_Jade | 园豆:111 (初学一级) | 2014-03-17 19:41
0

<script>
        window.onload = (function() {
        var name = "The Window";  
      var object = {  
        name : "My Object",  
        getNameFunc : function(){  
          return function(){  
            return this.name;   //因为这个是在 return function()这个匿名函数里所以这里的this它查找的是return function() 函数下的变量name,所以没找到
         };  
        }  
        };  
        alert(object.getNameFunc()());
    });
    </script>

 

<script>         window.onload = (function() {         var name = "The Window";  var t= this;       var object = {           name : "My Object",           getNameFunc : function(){             return function(){               return t.name;         };           }           };           alert(object.getNameFunc()());     });     </script>

收获园豆:5
虾哈哈 | 园豆:223 (菜鸟二级) | 2014-03-16 11:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册