2017-01-02 27 views
1

考虑下面的代码:为什么箭头功能表现怪异?

function Person (name) { 
    this.name = name; 
    this.showName = function() { console.log(name, this.name);} 
} 

var foo = new Person('foo'); 

var bar = new Person('bar'); 

foo.showName = bar.showName; 

foo.showName(); // prints "bar foo" 

预计,因为这仍然结合“富”。

箭头功能

现在:

function Person (name) { 
    this.name = name; 
    this.showName =() => console.log(name, this.name); 
} 

var foo = new Person('foo'); 

var bar = new Person('bar'); 

foo.showName = bar.showName; 

foo.showName(); // prints "bar bar" 

我知道“这”不绑定到箭头的功能。但是这里的“foo”的上下文已经在showName()中改变了。这本身就消除了“绑定”功能的一个用例。背后的原因是什么?

+0

对于一个很好的解释,也请看看这个:http://stackoverflow.com/questions/22939130/when-should-i-use-arrow-functions-in-ecmascript-6 – mplungjan

回答

4

在箭头函数中,this在词法上是解决的,基本上和其他变量一样,例如,像name。无论函数如何被调用,它的this值将在函数创建为时确定。

因此,this里面的bar.showName将始终引用由new Person('bar')创建的实例。


另请参阅What does "this" refer to in arrow functions in ES6?Arrow function vs function declaration/expressions: Are they equivalent/exchangeable?

+1

我不知道。我觉得值得谈论这个具体的例子。但我对此没有强烈的意见。 –

+1

@mplungjan我之前读过这个问题,但我认为这是一些具体的例子。即使您可以将变量分配给箭头函数,并且这只会始终指向原始对象。这是新东西,所以我认为重复是不合适的。 – MSati

+0

重新打开并链接到http://stackoverflow.com/questions/22939130/when-should-i-use-arrow-functions-in-ecmascript-6 – mplungjan