因为在整理梳理闭包,看到这段代码,有两个问题:
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用的不对吗?
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属性,只能说你取的名字刚好一致了。
最终返回的是一个方法 object.getNameFunc()() ,后一对"()"执行了此方法:return了this.name ,此时的 this 是 window 对象,此时你会疑问怎么弹出的内容不是undefined 。 这里就要注意一点 window.name 具体知识可自行查阅
谢谢你的回答~不过,我疑问的不是“弹出的内容不是undefined ”,而是它根本没有内容弹出来,测试环境时chrome 30.0.1599.101 m
@Iwillknow: 已经说了嘛,return this.name中的this是window对象,window对象中有一个默认为空的name属性
@yuyangtudou: 我懂你的意思^_^~不过呢,我还想请教你,对于”var name = "The Window";”这应该算是全局变量,而对于全局变量那不都是挂在window对象下的吗?混乱了=。=
@Iwillknow: 本身是全局的,不过在第二段代码中,你是写在function内部的,所以这个name的作用域就被改变了。就不再挂在window下了。
@幻天芒: 谢谢
<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>