以下是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
答案 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=2
和o.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
。