Javascript 为什么';这';指向';窗口';在iife中使用赋值运算符时的obj?

Javascript 为什么';这';指向';窗口';在iife中使用赋值运算符时的obj?,javascript,iife,Javascript,Iife,我想知道为什么示例会返回'global'而不是'obj2'?(obj2.say=obj1.say)和(obj2.say)之间有什么不同? 代码如下: var text='global'; var obj1={text:'obj1',比如:function(){console.log(this.text)}; var obj2={text:'obj2'}; (obj2.say=obj1.say)()(obj2.say)(将从obj2调用say函数 (obj2.say=obj1.say)(将obj

我想知道为什么示例会返回'global'而不是'obj2'?(obj2.say=obj1.say)和(obj2.say)之间有什么不同? 代码如下:

var text='global';
var obj1={text:'obj1',比如:function(){console.log(this.text)};
var obj2={text:'obj2'};
(obj2.say=obj1.say)()
(obj2.say)(
将从
obj2
调用
say
函数

(obj2.say=obj1.say)(
obj1.say
分配给
obj2.say
,然后调用它

我不确定
this.text
-我希望有人能帮上忙-甚至我也很想找到答案。

因为(obj2.say=obj1.say)的值是一个普通的函数对象,而obj2.say()是obj2的方法调用。

赋值的结果就是赋值的值。例如:

var foo, bar;
foo = (bar = 42);
console.log(foo); // 42
因此,当执行
(obj2.say=obj1.say)
时,分组运算符返回的赋值结果是
obj1.say
中的函数对象

整个表达式要等价于

var result = obj2.say = obj1.say;
result();
当函数以“正常”方式调用时(
func()


(obj2.say)(
实际上很特别。仅分组运算符不能解析(内部)对值的引用。也就是说,
obj2.say
的结果在内部是一个引用,它描述了
obj2
上的成员访问
say
。分组运算符,
(…)
返回未更改的引用,而不是将其解析为实际的函数对象。这就是为什么
将正确指向
obj2
。省略分组运算符具有相同的效果

这实际上是:

该算法不适用于表达式求值的结果。这样做的主要动机是,诸如
delete
typeof
之类的运算符可以应用于括号内的表达式


这里没有生命。@FelixKling-不是传统意义上的,但是
(obj2.say=obj1.say)
是一个计算结果为函数的表达式,该函数立即被调用。。。(是的,你说得对。)我希望它能回来。有趣的是,@nnnnnn是对的…
result=obj2.say=obj1.say
是我在自己(现在已放弃)的答案中努力给出的解释。干得好。