function foo() {
return this;
}
let bar = {
foo
};
console.log(
foo(),
bar.foo(),
(bar.foo)(),
(bar.foo = bar.foo)(), // здесь
);
实际上,很清楚为什么它bar.foo()
会返回bar
。为什么(bar.foo)()
会回来bar
- 太。但是为什么上下文在最后一个表达式中丢失了一点也不清楚。
也不清楚这种结构的作用。它最终会导致什么?左操作数还是右操作数?(很明显,在这种特殊情况下没有区别,但我说的是一般情况)。
foo()
- 全局上下文中的函数调用(这里一切都很简单)bar.foo()
- 调用对象方法bar
- JS 为您创建对象的键(通常,这样创建对象不好,但 JS 决定它应该看起来像这样{foo: foo, baz: baz}
)。见短符号(bar.foo)()
- 与前一种情况相同(bar.foo = bar.foo)()
——这里更有趣——我们调用的不是对象方法,而是全局函数,它是括号中表达式的结果。也就是说,我们获取字段的值 - 这是一个函数并将其分配给另一个字段(在这种情况下它们是相同的),但结果将是这个函数而不是字段(因为括号中的最后一个操作是赋值,而不是方法取消引用)添加
如果我们在严格模式下执行示例,我们将得到
undefined
. 在函数上下文中看到这个