2011-11-03 169 views
2

我想這可能是一個簡單的問題,但我自己弄不清楚(使用錯誤的搜索條件?)。將函數賦值給變量並傳遞參數

正如標題所說,我想一個函數分配給一個變量和一個變量傳遞給像這樣的功能:

function doStuff(control) { 
    var myObj = { 
     "smooth": false, 
     "mouseup": function(value) { 
      jQuery(_getSelectorStringFromControlId(control.id)).blur(); 
     } 
    }; 
} 

現在我想的control.id與之前其實際值替換該函數被分配給mouseup變量。

所以當control.id = 'myOwnId' 然後myObj.mouseup應該是:

function(value) { 
    jQuery(_getSelectorStringFromControlId('myOwnId')).blur(); 
} 

這又如何實現呢?

回答

1

我認爲你在這裏找的是一個閉包,它是一個函數,它記住變量在創建時的範圍(在你的情況下是「控件」),然後從其他地方調用。在你的例子中,你可以從doStuff函數返回myObj,並且每當你調用mouseup()時,它都會引用控件的「正確」值。所以實際上,你已經在示例代碼中創建了一個閉包。

如果你想關閉保持對它的引用只是ID,你可以這樣做:

function doStuff(control) { 
    var myId = control.id; 
    var myObj = { 
     "smooth": false, 
     "mouseup": function(value) { 
      jQuery(_getSelectorStringFromControlId(myId)).blur(); 
     } 
    }; 
} 

您現在可以有很多浮圓你的頁面MyObj中的副本,並在每一個, mouseup()將使用不同的ID。

閉包的更多信息: https://developer.mozilla.org/en/JavaScript/Guide/Closures

順便說一句,倒閉是最好的東西是永遠不會爲完全令人驚訝的人誰從來沒有做過任何函數式編程。

+0

封閉是要走的路,謝謝。事實上,我在一個循環中完成了整個函數分配,因此提供的鏈接中的'在循環中創建閉包:常見錯誤'段落給了我解決方案。 – Moolie

1

這是一個變量

var myFunc = function(x) { 
    console.log(x); 
} 

一旦分配函數的基本形式完成,你可以調用函數像這樣(在任何路過你想)

myFunc(1); 
+0

我的問題不是那麼簡單,當定義一個匿名函數替換參數與變量的值更棘手。N3dst4指出我正確的方向 – Moolie

1

你將不得不打電話:

var some_control = {id: "myOwnId"}; 
doStuff(some_control); 

它使用對象文字創建一個對象,{ }。然後,定義一個屬性id。整個對象作爲參數傳遞給函數doStuff

0
function doStuff(control) { 
    var myObj = { 
     "smooth": false, 
     "mouseup": function(value) { 
      jQuery(_getSelectorStringFromControlId(control.id)).blur(); 
     } 
    }; 
} 

doStuff({id: "yourID"}); // works now 

jsFiddle上測試。

還有一個問題:您無權訪問內部value參數,但我假設您要將此匿名函數綁定到事件偵聽器。