2016-06-06 98 views
1

我有以下箭頭函數轉換的ECMAScript 6的箭頭功能到正規功能

if(rowCheckStatuses.reduce((a, b) => a + b, 0)){}

rowCheckStatuses是1和0的陣列,該箭頭函數將它們加起來,以產生一個數字。該數字用作布爾值來確定數組中是否至少有一個「1」。

問題是,我不太明白箭頭函數是如何工作的,而且我的IDE認爲它是不好的語法,並拒絕檢查文檔的其餘部分是否有語法錯誤。

我該如何將其轉換爲常規功能以緩解這兩個問題?

+0

'function(a,b){return a + b; }' – Pointy

+0

顯然不是重複的。 OP詢問將=>轉換爲常規函數。 –

+1

@le_m如果他們瞭解他們,這將是微不足道的。 –

回答

0

你可以重構它爲:

if(rowCheckStatuses.reduce(function(a, b){return a + b}, 0) 

,其中初始累積是沒有必要的(除非你期望的陣列有時空),則可能是:

if(rowCheckStatuses.reduce(function(a, b){return a + b}) 

這數字充當布爾值以確定陣列中是否存在至少一個「1」

它可能更快(更清晰)使用方法:

if(rowCheckStatuses.some(function(a){return a == 1})) 

將返回如果有任何1S在rowCheckStatuses並會盡快遇到一個返回。另一種選擇是的indexOf

if(rowCheckStatuses.indexOf(1) != -1) 

很多替代品。

+1

這在技術上並不完全相同。如果您從箭頭函數更改爲函數表達式,則會丟失詞彙'this'。在這種情況下,它並不重要,因爲函數沒有引用它。但要牢記這一點很重要。 好消息是它很簡單 - 只需在函數中添加一個'.bind(this)'。 –

+1

@ JoeAttardi-好點,但正如你所說,詞彙*這個*在這種情況下是不相關的。 ;-) – RobG

2

箭頭功能通常可以通過與

function(<args>) { return <body>; } 

更換

(<args>) => <body> 

轉換所以你會

rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0) 

有此規則的例外所以它的很重要的是你在012上閱讀如果你想知道所有的差異。你還應該注意箭頭函數有一個詞彙this

1

更換箭頭的功能與普通的功能是通常沒有問題:

var f = x => y; 
var g = function(x) { return y; } 

或者,在具體的例子:

rowCheckStatuses.reduce((a, b) => a + b, 0); 
rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0); 

但是,要知道的例外的:

箭頭功能不綁定this值。因此箭頭功能訪問this可能返回的值封閉的執行上下文的this

function MyClass() {} 
 
MyClass.prototype.f =() => this; 
 
MyClass.prototype.g = function() { return this; } 
 

 
myClass = new MyClass(); 
 
console.log(myClass.f()); // logs `Window` 
 
console.log(myClass.g()); // logs `myClass`

箭頭功能也沒有到當地arguments對象訪問。在箭頭函數中訪問arguments可能會導致G。返回一個封閉函數的arguments

function test() { 
 

 
    var f =() => arguments; 
 
    var g = function() { return arguments; } 
 
    
 
    console.log(f()); // logs test's arguments 
 
    console.log(g()); // logs g's arguments 
 
} 
 

 
test('x');

這同樣適用於new.targetsuper。參見What are the differences (if any) between ES6 arrow functions and functions bound with Function.prototype.bind?