如何使用window [functionName]引用非全局函数?

时间:2012-02-08 03:37:09

标签: javascript jquery

我正在制作类似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();
}

但我有一种预感,认为这样做效率很低,而且做错了。

4 个答案:

答案 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 = {...};

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