关于闭包的问题,一个前端面试题(经典)


var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
     };
    }
};
alert(object.getNameFunc()()); //The Window。谁知道这个为什么会打印this window吗?对闭包不是很熟悉,请教你们一下。为什么调用的时候是window这个对象来调用的呢?

前端面试题 javascript闭包 JavaScript

队长别开枪是我 9 years, 8 months ago

 var name = "The Window";

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

var func = object.getNameFunc();

alert(func());

说实话,不觉得有多经典………………

另外这题也与闭包无关

天才桂老师 answered 9 years, 8 months ago

这个不是闭包的问题。
object.getNameFunc()() 相当于


 var temp = object.getNameFunc();
temp();
//所以this 是 window(如果不加 'use strict'的话)

F藐视A一切Y answered 9 years, 8 months ago

我在浏览器环境中跑了下结果的确如此,但是在node环境下结果是undefined,有人知道为什么么?

keisuke answered 9 years, 8 months ago

javascript this 指向的是引用

xyzad answered 9 years, 8 months ago

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

青山医院D院长 answered 9 years, 8 months ago

确实和闭包无关

保鲁夫拉姆 answered 9 years, 8 months ago

在 JavaScript 中, 上下文对象就是 this 指针,即被调用函数所处的环境。
没做特殊处理的话,this根据当前执行环境决定执行那个对象的

风雨中的FXR answered 9 years, 8 months ago

这个题目重点在于this的执行环境

obj.getNameFun()可以转换成
function() {
return this.name;
}
这个函数已经跟obj无关
而this是随着执行环境(局部,全局,apply,call,setTimeout)等,变化着它的指代的
所以,在全局范围运行的函数,this就是指向window

爆肝女青年A answered 9 years, 8 months ago

这个问题很有意思,但感觉上面几位都没有答到点子上。
我先试了一下这样:


 alert(object.getNameFunc());

结果是这样的:function(){return this.name;}
这个是什么?是return后面的匿名函数,也就是说这里把匿名函数当做一个变量返回了。这时我们就能想到,函数是可以作为值返回的。为什么要作为值返回呢?因为它就是一个值(这可不是废话,要理解)。要想返回函数的实现,就必须加上一个括号进行自执行。
剩下的问题就是this为什么指向了全局对象?其实这是一个基本的姿势。this是什么?是函数运行的环境。这里函数运行的环境是什么?是object对象吗?不是,js是没有块级作用域的,只有函数作用域。js全局对象就是由一个个嵌套函数形成的嵌套作用域形成的,所以函数运行的环境(this的指向)只能是父函数对象或者是调用子函数(this所在函数)的函数对象。
个人的理解,如有不妥欢迎指出。谢谢。


5月21日更新重要提示。
上面对this的理解有误,该问题中this指向全局对象的原因应该是闭包的存在。没有使用闭包的情况下this会指向object。

洗好菊花等曾春 answered 9 years, 8 months ago

这个问题很简单,就是this的指向问题,如果楼主用一个self变量来储存object,就可以了
var name = "The window";
var object={
name:"My Object",
getName: function(){
var self = this;
return function(){
return self.name;
}
}
}


 console.log(object.getName()());

风见幽香香 answered 9 years, 8 months ago


 var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
        //如果在这里 return this.name; 
        //log ‘My Object’
        //如果要在下面的function拿到‘My Object’
        //就要用另一个变量将this传递给另一个执行环境
        // that = this; 请看下面一段代码
      return function(){
        return this.name;
     };
    }
};
alert(object.getNameFunc()()); //The Window。

传递this


 
var name = "The Window"; var object = { name: "My Object", getNameFunc: function() { that = this; return function() { return that.name; }; } }; console.log(object.getNameFunc()());
CHzgq answered 9 years, 8 months ago

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

return回去的方法,this指向的是window,除非:


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

不给力的人 answered 9 years, 8 months ago

小鼻涕噶儿 answered 9 years, 8 months ago

Your Answer