Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用窗口[functionName]引用非全局函数?_Javascript_Jquery - Fatal编程技术网

Javascript 如何使用窗口[functionName]引用非全局函数?

Javascript 如何使用窗口[functionName]引用非全局函数?,javascript,jquery,Javascript,Jquery,我正在制作一个类似JS的框架。我希望用户能够向特定操作添加功能,就像wordpress插件一样: add_action("wp_head", "functionName"); 我看了其他的问题,最受欢迎的答案是 window['functionName'] 但是,当函数“functionName”不是全局的,而是位于$(document.ready({})中时,我该如何做呢;例如它抛出一个错误Uncaught TypeError:无法调用未定义的方法“call” 还有一个选项,即将用户函数作

我正在制作一个类似JS的框架。我希望用户能够向特定操作添加功能,就像wordpress插件一样:

add_action("wp_head", "functionName");
我看了其他的问题,最受欢迎的答案是

window['functionName']
但是,当函数“functionName”不是全局的,而是位于$(document.ready({})中时,我该如何做呢;例如它抛出一个错误Uncaught TypeError:无法调用未定义的方法“call”

还有一个选项,即将用户函数作为参数传递给add_action(如果我们假设我的函数也将命名为add_action):


但我有一种预感,这将是非常低效的,而且是一种错误的方法。

你不能。但是,如果绝对必须拥有全局函数,则可以将其固定到jQuery对象上:

$.yourSpecialFunction = function() {
  // ...
};
更糟糕的是,您可以将其添加到
窗口中

window.yourSpecialFunction = function() {
  // ...
}

但实际上没有理由这样做。

您可以将这些函数放在自己的对象上,并在文档中使用。就绪函数:

$(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]();

理想情况下,你真的想给你的应用命名——所以你有

window.MY_APP={…}


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

最后一种方法——传入函数——实际上是最好的方法。这既不是低效的,也不是错误的。

在其他函数触发操作时添加一组要执行的函数称为“事件处理”。不知道为什么会被否决……您是说您将有一组预定义函数供用户选择,或者用户可以以某种方式定义自己的函数?所以这里的解决方案是将函数作为参数传递?嗯。。。什么?对什么的争论?
$(document).ready(function() {
    window.myFunctionTable = {};
    window.myFunctionTable.myFunc = function() {};
});

// execute the function by name
var fnName = "myFunc";
window.myFunctionTable[fnName]();