关于javascript闭包和匿名函数的案例

时间:2012-10-17 03:59:07

标签: javascript

让我们先看代码

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

alert(object.getNameFunc()());

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

2 个答案:

答案 0 :(得分: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值。

答案 1 :(得分:1)

由于它是一个新的闭包,this的含义丢失了。 this一直是一个棘手的事情,所以我更喜欢始终使用var that = this启动这样的函数,以确保闭包内的意义不会丢失。