关于闭包的问题,一个前端面试题(经典)
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()()); //The Window。谁知道这个为什么会打印this window吗?对闭包不是很熟悉,请教你们一下。为什么调用的时候是window这个对象来调用的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
《javascript高级程序设计》 182页,7.2.2关于this对象,就是这个程序。里面有一句很关键的话
此問題和閉包無關。
js 的作者 Brendan Eich 這樣設計,是爲了讓任何不是以
a.b()
形式調用的函數看上去像是 window 對象的方法:也就是說,
b()
等價於window.b()
然而事實證明這一設計反直覺(其實 js 最初設計時沒有閉包,也就考慮不到閉包中的函數不該看作 window 的方法了)。
所以 ES6 新增了的 arrow function 可以按照題主的直覺執行了:
看看这篇:一个js闭包问题的解答
return function(){
return this.name;
};
return回去的方法,this指向的是window,除非:
把函数名和函数功能分开来看。
alert(object.getNameFunc()());
,函数功能是在全局作用域下实现的,所以指向window
。这个不是闭包的问题。
object.getNameFunc()()
相当于javascript
的this
指向的是引用我在浏览器环境中跑了下结果的确如此,但是在node环境下结果是undefined,有人知道为什么么?
说实话,不觉得有多经典………………
另外这题也与闭包无关
传递this
这个问题很简单,就是this的指向问题,如果楼主用一个self变量来储存object,就可以了
var name = "The window";
var object={
name:"My Object",
getName: function(){
var self = this;
return function(){
return self.name;
}
}
}
这个题目重点在于this的执行环境
obj.getNameFun()可以转换成
function() {
return this.name;
}
这个函数已经跟obj无关
而this是随着执行环境(局部,全局,apply,call,setTimeout)等,变化着它的指代的
所以,在全局范围运行的函数,this就是指向window
在 JavaScript 中, 上下文对象就是 this 指针,即被调用函数所处的环境。
没做特殊处理的话,this根据当前执行环境决定执行那个对象的
确实和闭包无关
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(context){
var self = this; // object
return function(){
console.log(this); //window
console.log(self); //object
return this.name; //return window.name
};
}};
getNameFuct是挂载到了object这个对象上,所以通过self捕获到的this指向object,而getNameFuc内部的匿名嵌套函数并没有挂载到object上,而是属于全局对象window的,使用this时访问的是window