gpt4 book ai didi

javascript - 使用 () 强制 JavaScript 解释器首先进行计算

转载 作者:行者123 更新时间:2023-11-28 03:11:34 25 4
gpt4 key购买 nike

我正在学习Js。在阅读 YDKJS 系列时,我看到了一个示例,并努力弄清楚发生了什么。

function foo() {
console.log(this.a);
}

var a = 90;

var obj1 = {
a: 1,
foo: foo
};

var obj2 = {
a: 2
};

(obj2.foo = obj1.foo)(); //90
obj2.foo(); //2

在这段代码中,为什么 (obj2.foo = obj1.foo)(); foo 的 this 变量指向全局对象,在下一行中,它指向 obj2,即在哪个上下文中调用该函数。你能告诉我,我在这里缺少什么吗? obj2.foo = obj1.foo 中 () 的正确作用是什么? IIFE 中也使用相同的语法。有人可以解释一下吗?

最佳答案

这不是相同的语法。 JavaScript 不区分方法和函数作为值,区别纯粹在于方法调用。语法 receiver.method(...args) (如果 receiver.method 是非箭头函数)作为方法调用,即它将设置 this 在通话期间发送给接收者。 (同样,语法 receiver[methodname](...args) 也会执行相同的操作。)

任何其他函数调用语法都只是函数调用,不会影响 this。具体来说,(obj2.foo = obj1.foo) 计算结果只是一个函数,它不知道它应该发送给哪个接收者,因此 this 是全局对象,以及 this.a 全局变量 a

编辑:示例...

window.context = "global";
let foo = {
context: "foo",
fn: function() { console.log(this.context); },
arrow: () => { console.log(this.context); },
}

console.log(this.context); // global object (`window` in browser, `global` in Node)
foo.fn(); // method call syntax; `this` is set to `foo`
foo["fn"](); // equivalent to the above; `this` is set to `foo`
foo.arrow(); // method call syntax but arrow, so doesn't matter; `this` is unchanged
let fnS;
fnS = foo.fn; fnS(); // no receiver, regular function call, `this` is unchanged
(fnS = foo.fn)() // equivalent to the previous one

在这些示例中,只有 foo.fn()foo["fn"]() 会将 this 设置为 foo;所有其他对象将保持原样(即 this 将是全局对象)。

关于javascript - 使用 () 强制 JavaScript 解释器首先进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60057448/

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