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值将成为默认窗口。谢谢