2011-07-19 136 views
0

我知道的功能被宣佈立即打,像這樣call是什麼意思:foo(function(params){...});

(function(arg) {...}(value))(); 

,但是這是什麼意思:

functionName(function(params){...}); 

正是在演示/演示(的第一個非行代碼) .js文件的Ace editor,這是我遇到過的最糟糕的JavaScript代碼。我想知道它是否真的寫得不好,或者我是否太新手來破譯它。

回答

2

在這種情況下,

outerFunc(function(params) { ... }) 

包含在一個匿名函數,它outerFunc用來控制它如何定義自己的模塊定義。在the code you're referring to中,他們使用RequireJS中的define函數來做幾件事情,包括指定依賴關係和執行上下文。

define()是CommonJS模塊規範的一部分,需要在您使用的不同JavaScript平臺上以不同的方式實現。這種代碼設計比合理;它遵循可能成爲未來語言核心部分的建議規範。

+0

'define'是commonJS的一部分AMD – Raynos

+0

@Raynos澄清。 –

2

將匿名函數傳遞給函數functionName()

如果寫得不好,或者你太新手了,那取決於,因爲它可能只是這種風格的合理使用方式。

+1

這段代碼編寫得很好,很明顯一個匿名函數被傳遞給另一個函數。根本沒有任何意圖,但如果你沒有選擇那個,你是一個新手,樸。傳遞匿名函數幾乎是麪包和黃油Javascript。 –

+0

我的問題是我找不到函數名('define')在哪裏。我更喜歡在我的代碼中進行大量的評論,如[this](http://easeljs.com/docs/DisplayObject.js.html)中的一段代碼。現在我不喜歡傲慢地捍衛自己的立場,但是當我聲稱這個文件過於複雜時,我覺得我是對的。例如,回調沒有在創建元素的index.html文件中指定,但在完全不同的文件中指定。這是什麼原因?追蹤非常困難。 – puk

0

它編碼不是很差。這是一個匿名函數被傳遞給函數functionName。該函數將有一個名稱爲localName的名稱,並可在其中調用。這在很多情況下非常有用。

sort(my_arr, function(obj1, obj2){ 
     return obj1.age*obj1.color - obj2.age*obj2.color; 
    } 
); 

function sort(arr, compare){ 
    // Sorts arr of objects using compare(arr[i], arr[j]); 
} 

這將允許你實現單一排序功能sort這對於所有可能的對象,只要調用者提供對該類型對象的比較功能的工作原理。

0
(function(arg) {...}(value)); 

這不是一個函數調用。你的意思可能是(function(params) {...}(value))(someArgs);

functionName(function(params){...}); 

這就要發揮作用functionName,傳遞一個匿名函數作爲參數調用。

這是(本質)一樣:

var f = function(params) { ... }; 
functionName(f); 

或:

function f(params) { ... }; 
functionName(f); 

考慮:

function functionName(f) { 
    f(); 
} 

...現在被調用。

+0

我想他實際上是指'(function(arg){...})(value);' – Paulpro

+0

@PaulPRO:啊,是的,還是那個。 –

相關問題