我有以下箭頭函數轉換的ECMAScript 6的箭頭功能到正規功能
if(rowCheckStatuses.reduce((a, b) => a + b, 0)){}
rowCheckStatuses
是1和0的陣列,該箭頭函數將它們加起來,以產生一個數字。該數字用作布爾值來確定數組中是否至少有一個「1」。
問題是,我不太明白箭頭函數是如何工作的,而且我的IDE認爲它是不好的語法,並拒絕檢查文檔的其餘部分是否有語法錯誤。
我該如何將其轉換爲常規功能以緩解這兩個問題?
我有以下箭頭函數轉換的ECMAScript 6的箭頭功能到正規功能
if(rowCheckStatuses.reduce((a, b) => a + b, 0)){}
rowCheckStatuses
是1和0的陣列,該箭頭函數將它們加起來,以產生一個數字。該數字用作布爾值來確定數組中是否至少有一個「1」。
問題是,我不太明白箭頭函數是如何工作的,而且我的IDE認爲它是不好的語法,並拒絕檢查文檔的其餘部分是否有語法錯誤。
我該如何將其轉換爲常規功能以緩解這兩個問題?
你可以重構它爲:
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)
很多替代品。
這在技術上並不完全相同。如果您從箭頭函數更改爲函數表達式,則會丟失詞彙'this'。在這種情況下,它並不重要,因爲函數沒有引用它。但要牢記這一點很重要。 好消息是它很簡單 - 只需在函數中添加一個'.bind(this)'。 –
@ JoeAttardi-好點,但正如你所說,詞彙*這個*在這種情況下是不相關的。 ;-) – RobG
箭頭功能通常可以通過與
function(<args>) { return <body>; }
更換
(<args>) => <body>
轉換所以你會
rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0)
有此規則的例外所以它的很重要的是你在012上閱讀如果你想知道所有的差異。你還應該注意箭頭函數有一個詞彙this
。
更換箭頭的功能與普通的功能是通常沒有問題:
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.target
和super
。參見What are the differences (if any) between ES6 arrow functions and functions bound with Function.prototype.bind?
'function(a,b){return a + b; }' – Pointy
顯然不是重複的。 OP詢問將=>轉換爲常規函數。 –
@le_m如果他們瞭解他們,這將是微不足道的。 –