2017-05-16 111 views
2

我是JS界的初學者,我有一個問題。 當我正在研究.forEach()JavaScript函數,我注意到它需要兩個參數,第一是一個函數,第二個是該obj的值和正常使用這樣的:如何調用函數作爲函數中的回調參數繼續?

function logArrayElements(element, index, array) { 
    console.log('a[' + index + '] = ' + element); 
} 

// Notice that index 2 is skipped since there is no item at 
// that position in the array. 
[2, 5, , 9].forEach(logArrayElements); 

但我還注意到,它可以也被稱爲是這樣的:

例如NUM 2:

[2, 5, , 9].forEach(function(){ 
console.log(arguments); 
}); 

如果.forEach()函數的回調函數作爲參數,第二個例子是如何正確的,因爲它需要一個函數定義不參考一個函數將被稱爲,

我的意思是爲什麼它在第二個示例中接受函數定義,雖然它需要一個定義的函數名稱?

我還指的forEach只需要一個函數的引用,所以當它循環的每個元素,它只會增加()的函數引用這樣的功能將被稱爲

回答

1

在第二個例子中,參數是一個匿名函數相比,第一,你所定義的函數首先使用它的引用傳遞給.forEach()。所以,兩者基本相同。你也可以寫第二個例子像

[2, 5, , 9].forEach(function(element, index, array){ 
    //do something with element 
}); 
+0

forEach在第一個例子中添加了()來調用函數,在第二個函數中如何定義它,然後將它設置爲參數然後用add()來調用函數,邏輯不公平。 – youhana

+1

JavaScript中的@youhana函數是第一類對象。第一個和第二個唯一的區別在於,第二個回調是在.forEach()內定義的。這在Javascript中有效。 – vabii

+0

您的評論是正確的,我搜索並修改了這一點,發現函數表達式(匿名函數或未命名的函數)返回一個函數的引用,該函數將引用該命名函數或已定義的函數,謝謝 – youhana

2

函數定義javascript返回指針到那個函數。你也可以去通過類似語法

let myFunction = function() { ... } // define function and save it into variable 
myFunction() // call the defined function 

因此,通過名字傳遞函數並傳遞函數的定義是一樣的東西

1

如果您在Polyfill看一看它的作用是它第一次檢查,如果通過回調的類型是一個函數,如果它不那麼它拋出一個錯誤,否則它使用call()來調用該函數,因此它的匿名函數或函數聲明無關緊要。

它還會檢查傳遞參數的數量是否爲> 1,或者在回調之後是否還有一個參數,並且您可以在回調中使用this訪問該參數。

function invoke(callback) { 
 
    if (typeof callback !== 'function') { 
 
    throw new TypeError(callback + ' is not a function'); 
 
    } 
 

 
    if (arguments.length > 1) var Obj = arguments[1]; 
 

 
    var value = 1; 
 
    callback.call(Obj, value); 
 

 
} 
 

 
invoke(function(e) { 
 
    console.log(this) 
 
    console.log(1 + e) 
 
}, {foo: 'bar'}) 
 

 
var another = function(e) { 
 
    console.log(10 + e) 
 
} 
 

 
invoke(another);

+0

答案是最好的,但只有forEach,我的問題是關於爲什麼在調用回調步驟之前的步驟,因爲我想知道函數表達式結果如何與指定的函數引用相同,並且市場中的註釋正確結果回答說,但你的答案對我來說是一個很好的新方法,謝謝你的時間。 – youhana

+0

@youhana不客氣。 –

0

來達到你有正確的答案: 讀取正確標註回答評論(最後一個註釋),然後看答案內納德Vracar區因爲他們都遮住了我的錯過了方法,感謝他們兩人。