我正在为JS制作类似框架的东西。我希望用户能够为特定操作添加函数,就像在wordpress插件中一样:
add_action("wp_head", "functionName");
我看了其他问题,最值得赞赏的答案是
window['functionName']
但是,当函数"functionName">不是全局的,而是位于$(document(.ready({}(中时,我该怎么做呢?它抛出错误未捕获的类型错误:无法调用未定义的方法"调用">
还有一个选择,即将用户的函数作为参数传递给add_action(如果我们假设我的函数也将命名为 add_action(:
add_action("some_event", functionName);
// in the framework's JS file:
function add_action(event, fn) {
fn();
}
但我有一种预感,这将是低效的,而且是一种错误的方法。
最后一种方法——传入函数——实际上是最好的方法。它既不是低效的,也不是错误的。
您可以将这些函数放在您自己的对象上,并在 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]();
你不能。 但是,如果你绝对必须有一个全局函数,你可以把它附加到jQuery对象上:
$.yourSpecialFunction = function() {
// ...
};
更糟糕的是,您可以将其添加到window
:
window.yourSpecialFunction = function() {
// ...
}
但真的没有理由这样做。
理想情况下,你真的想为你的应用程序命名 - 所以你有类似的东西
window.MY_APP = {...};
或者其他什么,然后将整个框架的所有方法/属性/模块添加到该命名空间中。