我正在制作类似JS的框架。我希望用户能够为特定操作添加功能,就像在wordpress插件中一样:
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 :(得分:1)
您可以将这些函数放在您自己的对象上,并在document.ready函数中使用它:
$(document).ready(function() {
var fns = {};
fns.myFunc = function() {};
// execute the function by name
var fnName = "myFunc";
fns[fnName]();
});
或者,如果你想在document.ready()范围之外引用它,你可以将它放在window对象上并使它成为你自己的命名空间全局:
$(document).ready(function() {
window.myFunctionTable = {};
window.myFunctionTable.myFunc = function() {};
});
// execute the function by name
var fnName = "myFunc";
window.myFunctionTable[fnName]();
答案 1 :(得分:1)
最后一种方式 - 传递函数 - 实际上是最好的方法。它既不低效也不错。
答案 2 :(得分:0)
你做不到。但是,如果您绝对必须具有全局函数,则可以将其添加到jQuery对象中:
$.yourSpecialFunction = function() {
// ...
};
更糟糕的是,您可以将其添加到window
:
window.yourSpecialFunction = function() {
// ...
}
但实际上没有理由这样做。
答案 3 :(得分:0)
理想情况下,您真的想要命名您的应用程序 - 所以您有类似
的东西 window.MY_APP = {...};
或者其他什么,然后将整个框架的所有方法/属性/模块添加到该命名空间。