2016-07-05 50 views
5

我做的詞彙範圍,以打字稿處理的教程,我已經遇到使用這是我從未見過的功能。這看起來像forEach語句中的空函數。在打字稿它看起來像這樣:Typscript/JavaScript的的forEach

fns.forEach(fn=>fn()); 

在javascript中,它看起來像:

fns.forEach(function (fn) { return fn(); }); 

我從來沒有見過像這樣使用的功能。有人可以解釋這是如何工作的?具體來說,fn => fn()實際執行的是什麼。參考下面的代碼,它是執行fns.push還是for循環?如果它是For Loop,那麼它沒有提及,所以它是如何知道的?

下面是全碼:

打字稿:

var fns = []; 
for(var i=0;i<5;i+=1){ 
    fns.push(function(){ 
     console.log(i); 
    }) 
} 
fns.forEach(fn=>fn()); 

的JavaScript

var fns = []; 
for (var i = 0; i < 5; i += 1) { 
    fns.push(function() { 
     console.log(i); 
    }); 
} 
fns.forEach(function (fn) { return fn(); }); 
+1

什麼這麼複雜?它執行數組中的每個函數。但是,由於關閉問題,您的示例將不起作用。嘗試將'for'循環中的'var'更改爲'let'。此外,雖然與您的問題無關,但箭頭功能並非TypeScript特有的 - 它們只是普通的舊ES6。 – 2016-07-05 06:01:45

回答

3

退房這個例子:

var method = a => a+1; 

method是保持對函數的基準的變種。
a是輸入參數。
a+1是方法體和返回類型。

打字稿將transpile到這一點:

var method = function (a) { return a + 1; }; 

退房的typescript playground example,你就會理解這個概念非常快。

在您的例子是FNS功能的陣列。

fns.forEach(fn=>fn());裝置執行FNS陣列中的每個方法。

+0

感謝您的迴應,所以我感到困惑的是它正在執行的實際方法是什麼?例如For循環或fns.push ?? –

+0

啊現在它的方法是function(){console.log(i)};那是我錯過的。感謝您的解釋! –

2

它是通過函數數組循環,因爲功能可以內部存儲像字符串,整數等變量。所以你通過一個陣列循環函數y和執行它們像這樣:return fn();

3

fn => fn()是一個函數的定義,在C#中,他們被稱爲Lambda表達式,它僅僅是相同function (fn) { return fn(); }語法糖。

fn是輸入參數,=>將其定義爲函數,而fn()是返回值。

又如

var add = (a,b) => a + b; 

相同

function add(a, b) { 
    return a + b; 
} 
+0

在這種情況下,它可能是語法糖,但總的來說,它不是,在這個意義上,「這個」和相關問題的定義是不同的。 – 2016-07-05 06:17:44