gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:17:25 29 4
gpt4 key购买 nike

先看代码

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

alert(object.getNameFunc()());

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

最佳答案

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

因为没有对象上下文,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的值函数调用。

关于javascript - 一个关于javascript闭包和匿名函数的案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12926900/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com