Javascript 为什么是";这";价值观不同?
下面是一个例子,其中Javascript 为什么是";这";价值观不同?,javascript,this,Javascript,This,下面是一个例子,其中o.foo()是3,但是(p.foo=o.foo)()是2吗 函数foo(){ console.log(this.a); } var a=2; var o={a:3,foo:foo}; var p={a:4}; o、 foo();//3. (p.foo=o.foo)();//2“在此函数调用之前执行赋值操作: (p.foo = o.foo)(); 导致对p的对象引用丢失。如果你改写 p.foo = o.foo; p.foo(); 你会得到4分。实际上,您得到2,因为函数
o.foo()代码>是3,但是(p.foo=o.foo)()代码>是2吗
函数foo(){
console.log(this.a);
}
var a=2;
var o={a:3,foo:foo};
var p={a:4};
o、 foo();//3.
(p.foo=o.foo)();//2“
在此函数调用之前执行赋值操作:
(p.foo = o.foo)();
导致对p
的对象引用丢失。如果你改写
p.foo = o.foo;
p.foo();
你会得到4分。实际上,您得到2,因为函数中this
的值将是window
因为带括号的子表达式是赋值结果,所以没有与表达式结果直接关联的对象查找-赋值表达式的值只是没有上下文对象的函数引用。因此,运行时在调用函数时没有用于this
的值,因此this
默认绑定到窗口(或任何上下文中的全局对象)。这:
(p.foo = o.foo)();
与执行此操作基本相同:
d = (p.foo = o.foo);
d();
基本上,它说的是赋值的返回是全局上下文中的函数本身。其中a
是2。实际上,由于代码段没有运行,您的代码是错误的,您应该执行以下操作:console.log(this.a)代码>
现在,让我们看看它是如何工作的
function foo() {
console.log( this.a );
}
这将在调用者的范围内调用this
,因此让我们来调查我们的结果
因此,您正在全局设置a=2
,然后在对象o.a=3
和p.a=4
因此:
调用o.foo
将返回3
,因为它指向o
调用p.foo
将返回4
,因为它指向p
但是
调用(p.foo=o.foo)()
它将返回2
,因为它不指向任何对象,因此它将获取您的作用域(即全局作用域),然后返回2
如果你同意:
p.foo = o.foo
p.foo() //4
它将成功返回4,因为它指向p
你的意思是o.foo()
返回{a:3,foo:ƒ}
?@UladKasach控制台.log(this.a)代码>编辑了我的代码这是因为您使用的是自调用函数。看看@AlexandreMiziara-你确定这是一种生活吗?如果是,那如何解释结果呢?当你做p.foo=o.foo时。您正在尝试指定两个不相等的对象(一个对象的属性多于另一个)。然后在最后调用()命令函数立即调用。当然,这会引起一些问题,我认为这种解释是错误的……”这个()创建了一个子表达式“layer”,它会导致对象关联被删除。”-但它肯定比这更复杂<代码>(o.foo)()代码>很好。@OliverCharlesworth是的,这是我意识到的,因为模糊的记忆让我觉得我肯定在这种情况下使用了括号(但不完全是这样);看编辑,我觉得有点奇怪。为什么p会丢失而不是o?o不是r_值操作数吗?@Callat see edit;在最后一段中最初的解释是我在思考清楚之前键入。已经将我的代码更改为console.log(this.a)代码>谢谢=)@AlexeyTseitlin是的,我在写了我的答案后注意到了,希望能有所帮助