如何使用窗口[函数名称]引用非全局函数



我正在为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 = {...};

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

最新更新