Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么是";这";价值观不同?_Javascript_This - Fatal编程技术网

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是的,我在写了我的答案后注意到了,希望能有所帮助