var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function()
{
return function()
{
return this.name;
};
}
};
alert(object.getNameFunc()());上面这段代码会输出“The Window”,请问这个跟闭包有什么区别?或者如果是闭包的话为什么不是输出My Object?

解决方案 »

  1.   

    这个不是闭包吧object 仅仅是个对象,
    object.getNameFunc()() 这个的时候 this是指向window的
      

  2.   

    object.getNameFunc()() 时this不是指向object吗?
      

  3.   

    这个现象有点复杂。。说说我的想法吧首先普及下知识
    function fn(){
       this.name = "123"
    }
    两种调用方式
    1,fn(); //this指向window
    2,new fn(); //this指向fn本身看楼主的例子
    var name = "The Window";
    var object = {
        name : "My Object",
        getNameFunc : function()
        {
            return function()
            {
                return this.name;
            };
        }
    };
    alert(object.getNameFunc()());首先var object = {} 等同于  var object = new Object();
    所以他里面的this是绑定到本身对象的,所以当我们改一下例子var object = {
        name : "My Object",
        getNameFunc : function() {   
            alert(this.name); //这里this指向object
            return function()
            {
                return this.name;
            };
        }
    };我们继续分析
    alert(object.getNameFunc()());//打印出My Object与The Window是不是还是有点不明白?
    拆分来看,它等同于
    var _fn = object.getNameFunc();alert(_fn());这样就容易分析了
    object.getNameFunc();//里面的this绑定的是object本身,所以会打印出My Object
    而object.getNameFunc()其实就是return 了 function(){      return this.name;};
    所以 _fn 等同于
    var _fn = function(){ return this.name;};我们回头看普及的知识
    我们就知道_fn()这样调用this指向的是window,所以我们就知道了this.name就是"The Window";
      

  4.   

    alert(object.getNameFunc().apply(object));
      

  5.   

    补充下两种调用方式
    1,fn(); //this指向window,正确来说,应该是绑定到上一级作用域的上下文
    2,new fn(); //this指向fn本身
      

  6.   

    var name = "The Window";
    var object = {
        name : "My Object",
        getNameFunc : function()
        {
            return function()
            {
                return this.name;
            };
        }
    };
    alert(object.getNameFunc()());红色的返回一个函数
    function()
            {
                return this.name;
            };
    返回这个函数以后,进行调用,但并不是在object上调用 ,而是在 window上调用
    只有在某个对象上调用某个函数,这个函数才指向那个对象
      

  7.   

    多谢各位特别是liangws的耐心回答,这次真正体会到js里this的神奇,看起来this只是任意对象和function结合时的一个概念,而不一定是函数本身所属对象,和其他面向对象语言很不同!
      

  8.   

    不要被C++里的this迷惑了,js里同一个函数可以从不同的角度进行调用,this并不一定是函数本身所属的对象,this只是在任意对象和function元素结合时的一个概念,对应到你的帖子里其实就是getNameFunc函数和window对象的结合,所以this是window。