javascript闭包和匿名函数一例

javascript闭包和匿名函数一例,javascript,Javascript,让我们先看看代码 var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); 结果是“窗口”; 我想知道每一步都发生了什么。 我认为这个指向调用这个函数的对象;正确的? 但

让我们先看看代码

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

alert(object.getNameFunc()());
结果是“窗口”; 我想知道每一步都发生了什么。 我认为
这个
指向调用这个函数的对象;正确的?
但是为什么在这种情况下
这个
窗口

第二个函数调用不是从对象的上下文中进行的,而是从第一个调用返回的函数中进行的

因为没有对象上下文,
值与任何其他函数一样成为默认的
窗口

 //   v-----------------v------function has context
alert(object.getNameFunc()());
            // -----------^----second function was returned from the first
            //                   and invoked so there's no object context
如果我们将返回的函数分配给
对象
,然后从该上下文调用它,
这个
将成为对
对象
的引用

obj.foo = object.getNameFunc();
obj.foo();  // "My Object"
同样精确的函数,但现在它作为
对象
的属性被调用,它隐式地将其
值设置为
对象

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

这个
的规则非常简单易懂,但可能不是您最初期望的

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

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'
因此,您可以看到,当调用函数时,默认值为
窗口
,而不与其他对象建立任何连接

但是当我们将函数作为对象的属性调用时,
这个
突然引用了那个对象


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

由于这是一个新的闭包,因此
this
的含义将丢失
这个
一直是一个棘手的问题,所以我更喜欢总是用
var=this
启动这样一个函数,以确保闭包中不会丢失其含义。

如果没有对象上下文,this值将成为默认窗口。谢谢