1

先看代码

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

alert(object.getNameFunc()());

结果是"The Window";我想知道每一步发生了什么。我认为this是指向调用此函数的对象;正确的?但是为什么在这种情况thiswindow

4

2 回答 2

1

第二次函数调用不是从对象的上下文中发生的,而是从第一次调用返回的函数中发生的。

因为没有对象上下文,所以该值就像任何其他函数一样this成为默认值。window

 //   v-----------------v------function has context
alert(object.getNameFunc()());
            // -----------^----second function was returned from the first
            //                   and invoked so there's no object context

如果我们将返回的函数分配给object,然后从该上下文中调用它,this那么将是对 的引用object

obj.foo = object.getNameFunc();
obj.foo();  // "My Object"

完全相同的函数,但现在它作为 的属性被调用object,隐式将其this值设置为object


的规则this非常简单易懂,但可能不是您一开始所期望的。

this值是非常动态的,并且完全基于函数的调用方式

foo();            // 'this' is 'window'

object.foo();     // 'this' is 'object'

foo.call(object); // 'this' is 'object'
foo.apply(object);// 'this' is 'object'

var bar = foo.bind(object);
bar();            // 'this' is 'object'

因此,您可以看到默认情况是window在调用函数时没有任何类型的与另一个对象的连接。

但是当我们把函数作为一个对象的属性来调用时,this突然就引用了那个对象。

或者我们可以使用.call,.apply或者.bind手动设置this函数调用的值。

于 2012-10-17T04:03:39.010 回答
1

由于它是一个新的闭包,因此this失去了意义。this一直是一件棘手的事情,所以我更喜欢总是启动这样的函数,var that = this以确保在闭包中不会丢失含义。

于 2012-10-17T04:04:36.343 回答