2016-07-04 29 views
-1

我一直在使用這個功能往往:在$.each(Ojbect, function),函數應該期待兩個參數:爲什麼它能夠工作,如果我傳遞一個無參數函數作爲期望參數的回調函數?

function (index, value) {...} 

(每jQuery的API文檔:enter link description here)。大多數情況下,我定義了一個非參數函數。例如,僅打印出該值。

$.each([1,2,3], function(){ 
    console.log($(this); 
}); 

所以$ .each接受我的無參數函數。這在日常使用中非常方便。但我還沒有找到任何官方文件說這是好的。請記住,爲什麼這種方式有效?

+1

。注意,這是jQuery的那個安排'this'指陣列中的每個元件。如果你在數組原型上使用原生的'.forEach()',它會*不*這樣做,所以你的回調不起作用。 – Pointy

回答

2

也就是說JavaScript函數調用是如何工作的。傳遞給函數的參數數量不需要與該函數定義中的參數數量相匹配。如果參數比參數少(如你的例子中那樣),參數仍然可以在函數內通過參數數組類似的對象訪問。如果有比參數的詳細參數,不匹配的參數變量會undefined

[ 
function(){ console.log(arguments); },  // ['foo', 'bar'] 
function(x){ console.log(x, arguments); }, // 'foo' ['foo', 'bar'] 
function(x,y){ console.log(x, y); },  // 'foo' 'bar' 
function(x,y,z){ console.log(x, y, z); }, // 'foo' 'bar' undefined 
]. 

// Call each function with two arguments: 'foo' and 'bar' 
forEach(func => func('foo', 'bar')); 
0

回調參數是可選的,不管你設置與否完全取決於你的需要。如果你必須在你的回調範圍內訪問它們,它們應該在那裏。在您的console.log示例中,可以保留參數。這導致其是較短的,更容易讀取的代碼(因爲沒有未使用的VARS在它)

0

在Javascript中,參數僅需要當它們存在於一個函數使用限定。如果他們沒有被使用,那麼最佳實踐建議他們不要被定義(事實上,如果參數被定義但未被使用,則諸如jshint和jslint的Javascript代碼分析工具將報告錯誤)。

所以,在回答你的問題,這是完全正常的,你必須定義你的函數。

2

JavaScript是與功能是一等公民動態語言。此外,函數參數幾乎被命名爲別名,以定位類似於數組的對象元素。

既然你可以用0參數定義功能,仍然可以看到的傳遞給它的參數值:

(function() { console.log(arguments) })('a',1,null, 'hey') 

>outputs: ["a", 1, null, "hey"] 

因爲JS是動態的語言,也沒有辦法爲VM它執行函數參數類型或者其數量。例如,也沒有辦法指定類型。

在打字稿有這樣的事情,這讓你強制執行類型和傳遞給函數的參數個數更好的支持,但你看到的是怎樣的JavaScript的作品。