Javascript 在jQuery中使用动态生成的名称创建时态函数

Javascript 在jQuery中使用动态生成的名称创建时态函数,javascript,jquery,function,create-function,Javascript,Jquery,Function,Create Function,我有一个动态加载的外部javascript文件,它有一个oncomplete=变量,每次调用它时它的值都会增加。例如: 第一次:external.js?oncomplete=sayHello1 第二次:external.js?oncomplete=sayHello2 第三次:external.js?oncomplete=sayHello3 因此,我需要动态创建函数,以便每次执行oncomplete=callback。这意味着,我需要创建具有以下名称的函数: sayHello1() sayH

我有一个动态加载的外部javascript文件,它有一个
oncomplete=
变量,每次调用它时它的值都会增加。例如:

  • 第一次:external.js?oncomplete=sayHello1
  • 第二次:external.js?oncomplete=sayHello2
  • 第三次:external.js?oncomplete=sayHello3
因此,我需要动态创建函数,以便每次执行oncomplete=callback。这意味着,我需要创建具有以下名称的函数:

  • sayHello1()
  • sayHello2()
  • …等等
这是我当前的代码,它创建了一个特定的名称函数:

var sayHello = function (){
    console.log('hello');
};
sayHello();

问题是:如何在jQuery中使用动态生成的名称创建时态函数?

这更像是一个纯javascript问题。为简单起见,假设全局范围(窗口)

var sayHello = function () { /* body */ };
相当于

window['sayHello'] = function () { /* body */ };
现在,很明显,你不想像那样污染全局范围,所以你可以对任何其他对象做同样的事情

dynamicFunctions = {};

var oncomplete = 'sayHello1';
dynamicFunctions[oncomplete] = function () { console.log('hello'); };

dynamicFunctions[oncomplete]();
// outputs hello to the console
不过,有一件事需要记住,那就是你为什么要这样做。由于我不确定您的具体要求,您有没有理由不能这样做

// load external.js?oncomplete=sayHello&increment=4
sayHello(increment);

你想达到什么目标?可能有一种更直接的方法来解决这个问题。您可以使用
window
属性表示法:
window[func\u name]=function(){…}
@sholanozie因为external.js文件来自另一台服务器,所以我必须按照他们的说明操作。每次加载脚本时,oncomplete=值都会发生变化,并执行一个具有oncomplete值的函数(如果它不存在,则会抛出一个错误。我猜您的服务器正在生成一个以
/*some stuff*/sayHello1()
结尾的javascript。如果是这样,您可能会从中获得生成
/*some stuff*/sayHello(1)的灵感
好的,我刚刚看到您没有访问服务器的权限,然后简单地使用@hindmost的解决方案。他确实必须使用窗口名称空间,因为服务器使用JSONP响应,而他没有访问服务器的权限。@AkshayDhalwala很好的方法。我首先回答您的问题:很遗憾,我不能将计数值作为参数发送,主要是b由于外部服务器的严格要求。@AkshayDhalwala我正在尝试实现此解决方案,但有一个小问题。由于服务器的响应将是
sayHello1(response.object)
…它将抛出一个错误,因为sayHello1()不存在,根据您的代码,实际存在的是
动态函数我的主要问题是:污染全球范围会有什么问题?我可以很容易地将
窗口['sayHello1']=null
设置在
窗口['sayHello2']
内,或者你会建议不要这样做吗?啊,显然我错过了你的一些要求。做window['sayHello1']也可以。将所有内容都放在窗口中实际上并没有什么错;它只是意味着代码无处不在,可能会覆盖某些内容或被覆盖。比如(无论出于何种原因)您正在使用的另一个插件意外地覆盖了窗口['sayHello']。