为什么“这个”价值不同?

时间:2018-04-17 19:52:46

标签: javascript this

以下是o.foo();为3但(p.foo = o.foo)();为2?

的示例

function 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”

如果我这样做,那么我得到4这就是我想要的。这两个例子有何不同?

p.foo = o.foo;
p.foo();  // 4

3 个答案:

答案 0 :(得分:6)

这:

(p.foo = o.foo)();

与这样做几乎相同:

d = (p.foo = o.foo);
d();

基本上它所说的是赋值的返回是全局上下文中的函数本身。其中a为2。

答案 1 :(得分:4)

在函数调用之前执行该赋值操作:

(p.foo = o.foo)();

导致p的对象引用丢失。如果你写了

p.foo = o.foo;
p.foo();

你得到4.实际上,你得到2,因为this的值在函数中将是window

因为带括号的子表达式是赋值结果,所以没有与表达式结果直接关联的对象查找 - 赋值表达式的值是只是没有上下文的函数引用宾语。因此,运行时调用函数时没有this使用的值,因此this默认绑定到window(或任何上下文中的全局对象)

答案 2 :(得分:4)

实际上您的代码错误,因为您的代码段没有运行,您应该执行以下操作:<DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button> <Path Fill="Black" > <Path.Style> <Style TargetType="Path"> <Style.Triggers> <DataTrigger Binding="{Binding EvenOddProperty}" Value="0"> <Setter Property="Data" Value="{StaticResource RightArrow}" /> </DataTrigger> <DataTrigger Binding="{Binding EvenOddProperty}" Value="1"> <Setter Property="Data" Value="{StaticResource LeftArrow}" /> </DataTrigger> </Style.Triggers> </Style> </Path.Style> </Path> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate>

现在,让我们看看它是如何工作的。

console.log( this.a );

这将在调用者的范围内调用function foo() { console.log( this.a ); } ,因此我们调查一下我们的结果。

所以,您要全局设置this,然后设置对象a=2o.a = 3

这样:

调用p.a=4它将返回o.foo,因为它指向3

调用o它将返回p.foo,因为它指向4

BUT

调用p它将返回(p.foo = o.foo)();,因为它没有指向任何对象,因此它将占用您的范围(这是全局范围),然后它将返回2

如果你选择:

2

它将成功返回4,因为它指向p.foo = o.foo p.foo() //4