gpt4 book ai didi

javascript - JS : If you call the function, 结果是 3,但是如果你用 f.call(f) 绑定(bind)上下文 - 结果是 5

转载 作者:行者123 更新时间:2023-12-05 04:31:53 25 4
gpt4 key购买 nike

var f = function() {
this.x = 5;
(function() {
this.x = 3;
})();
console.log(this.x);
};

var obj = {
x: 4,
m: function() {
console.log(this.x);
}
};

f(); // 3
new f(); // 5
f.call(f); // 5
obj.m.call(f); // 5

如果您调用该函数,结果为 3,但如果您将上下文与 f.call(f) 绑定(bind) - 结果为 5。此外,如果我将函数作为构造函数调用。为什么会这样?很抱歉这个愚蠢的问题,但我试图找到答案,但找不到。

最佳答案

  • 在第一种情况下,您调用 f()作为一个简单的命名函数。所以 this其中的关键字指的是全局范围(窗口)。

    结果:this在函数体内和 this在函数体内的闭包内部指向同一个对象:窗口。

  • 在第二种情况下,您将 f() 作为构造函数调用,因此 this关键字将指向创建的对象。但是闭包,因为它是匿名的,将继续使用 this 引用全局范围。 ,所以在这种情况下,它们并不指向相同的东西和构造函数创建的对象 f()不会被闭包改变。

  • 在第 3 种情况下,您调用 f与第一次一样,但指定了 this 的值作为函数 f本身。所以 this 的行为这里相当于第二种情况。

  • 在第 4 种情况下,您调用 m使用 f 的上下文, 所以 this.x将引用f对于 this , 和里面的闭包 f一直指着窗口。

关于javascript - JS : If you call the function, 结果是 3,但是如果你用 f.call(f) 绑定(bind)上下文 - 结果是 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71767870/

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