2012-02-08 47 views
1

我正在做一個像JS的框架。我希望用戶能夠功能添加到特定的動作,就像在WordPress插件:如何使用窗口[functionName]引用非全局函數?

add_action("wp_head", "functionName"); 

我看了看其他的問題,而最欣賞的答案是

window['functionName'] 

但是怎麼辦當函數「functionName」爲而非全局,但位於$(document).ready({});例如?它會拋出一個錯誤Uncaught TypeError:無法調用未定義的方法'call'

還有一個選項,即將用戶函數作爲參數傳遞給add_action(如果我們假設我的函數也將被命名爲add_action ):

add_action("some_event", functionName); 
// in the framework's JS file: 
function add_action(event, fn) { 
    fn(); 
} 

但是我有一種預感,這將是低效的,因爲地獄和錯誤的方式做到這一點。

+0

當某個其他函數觸發某個動作時,添加一組要執行的函數稱爲「事件處理」。 – zzzzBov 2012-02-08 03:39:45

+0

不知道爲什麼這是低票... – 2012-02-08 04:03:09

+0

你是說你將有一組預定義的功能,用戶可以選擇,或用戶可以以某種方式定義自己的功能? – nnnnnn 2012-02-08 04:28:49

回答

1

最後一種方法 - 傳遞函數 - 實際上是最好的方法。它既不低效也不錯。

0

你不行。但是,如果你絕對必須有一個全球性的功能,你可以把它釘住到jQuery對象:

$.yourSpecialFunction = function() { 
    // ... 
}; 

更糟的是,你可以把它添加到window

window.yourSpecialFunction = function() { 
    // ... 
} 

但真的沒有理由這樣做那。

+0

所以這裏的解決方案是作爲參數傳遞函數? – 2012-02-08 04:00:31

+0

呃......什麼?什麼的爭論? – Pointy 2012-02-08 04:04:37

1

你可以把這些功能你自己的對象,並使用它的document.ready函數內部:

$(document).ready(function() { 
    var fns = {}; 
    fns.myFunc = function() {}; 

    // execute the function by name 
    var fnName = "myFunc"; 
    fns[fnName](); 
}); 

或者,如果你想引用它的document.ready()範圍之外,可以把它放在窗口對象,並讓它成爲你自己的全球命名空間:

$(document).ready(function() { 
    window.myFunctionTable = {}; 
    window.myFunctionTable.myFunc = function() {}; 
}); 

// execute the function by name 
var fnName = "myFunc"; 
window.myFunctionTable[fnName](); 
0

理想情況下,你真的想命名空間您的應用程序 - 讓你擁有像

window.MY_APP = {...};

或其他什麼,然後你將所有的方法/屬性/模塊的整個框架添加到該名稱空間。