2012-02-08 52 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 = {...};

或其他什么,然后你将所有的方法/属性/模块的整个框架添加到该名称空间。