Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.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函数_Javascript_Jquery_Scope_Closures - Fatal编程技术网

如何调用动态加载的javascript函数

如何调用动态加载的javascript函数,javascript,jquery,scope,closures,Javascript,Jquery,Scope,Closures,我正在基于jquery的getscript实现一个按需脚本控制器,它看起来如下: function controller = function(){ var script = function(){ var scripts = {}; return { load: function(jsurl){ $.getScript(jsurl, null); }, run: function(js){

我正在基于jquery的getscript实现一个按需脚本控制器,它看起来如下:

function controller = function(){

   var script = function(){
      var scripts = {};
      return {
        load: function(jsurl){
          $.getScript(jsurl, null);
        },
        run: function(js){
          window[js].apply(this,null);
        }
      }
   };

  return {
    script: script()
  };

}

var ctlr = controller();
然后是一个远程脚本,其中有一个要加载的函数-remote.js

function remotefunc(){
  alert( 'remotefunc invoked' );
}
在主脚本中,整个过程应该是这样的:

ctlr.script.load( 'remote.js' ); // remote script successfully loaded
ctlr.script.run( 'remotefunc' ); // got an error, window['remotefunc'] undefined
但是正如您所看到的,“remotefunc”是在全局“window”范围中定义的,因此window对象应该能够“看到”它

我认为问题可能是“controller”定义中的闭包内容,因此我在不使用“controller”的情况下直接执行了$.getScirpt:

$.getScript( 'http://path/to/remote.js', function(){
  window['remotefunc'].apply( this, null );  // this worked
} );
奇怪。所以这是关于“控制器”的实现(我需要它)!有人能帮我吗?如何修复“控制器”实现,以便

 window[js].apply(this,null);
你真的能工作吗


Thanx.

它告诉您window['remotefunc']未定义的原因是,在尝试调用其中定义的函数之前,您没有给它实际下载和执行远程脚本的时间

远程脚本是异步加载的,这意味着在等待响应时脚本执行不会暂停

您需要重新实现getScript方法以实现同步,或者以某种方式围绕函数在任何确定的时间内都不可用这一事实来工作您的类

编辑:刚刚找到另一个可能的解决方案,请在请求之前尝试调用此解决方案

$.ajaxSetup({async: false});

这将使getScript方法同步

它告诉您window['remotefunc']未定义的原因是,在尝试调用其中定义的函数之前,您没有给它实际下载和执行远程脚本的时间

远程脚本是异步加载的,这意味着在等待响应时脚本执行不会暂停

您需要重新实现getScript方法以实现同步,或者以某种方式围绕函数在任何确定的时间内都不可用这一事实来工作您的类

编辑:刚刚找到另一个可能的解决方案,请在请求之前尝试调用此解决方案

$.ajaxSetup({async: false});

这将使getScript方法同步

这可能是时间问题吗


在您的工作示例中,您在回调中调用函数,
jQuery
在加载脚本之前不会调用该函数。在非工作示例中,您在异步加载脚本后立即调用函数。

这可能是一个计时问题吗


在您的工作示例中,您在回调中调用函数,
jQuery
在加载脚本之前不会调用该函数。在非工作示例中,在异步加载脚本的
getScript
之后立即调用函数。

当使用类似
getSript
的东西时,务必记住它是异步获取的。也就是说,浏览器会发出请求,当请求发生时,该行后面的代码会毫不停顿地执行

jQuery提供了一个回调函数参数来获取脚本,该脚本允许您在异步获取完成后执行某些操作

试试这个:

 var script = function(){
      var scripts = {};
      return {
           load: function(jsurl, callback){
                $.getScript(jsurl, callback);
           },
           run: function(js){
                window[js].apply(this,null);
           }
     }
 };
然后,在使用时:

 ctlr.load( 'remote.js', function(){
      // remote script successfully loaded
      ctlr.run( 'remotefunc' ); 
 }); 

当使用类似于
getSript
的东西时,重要的是要记住它是异步获取。也就是说,浏览器会发出请求,当请求发生时,该行后面的代码会毫不停顿地执行

jQuery提供了一个回调函数参数来获取脚本,该脚本允许您在异步获取完成后执行某些操作

试试这个:

 var script = function(){
      var scripts = {};
      return {
           load: function(jsurl, callback){
                $.getScript(jsurl, callback);
           },
           run: function(js){
                window[js].apply(this,null);
           }
     }
 };
然后,在使用时:

 ctlr.load( 'remote.js', function(){
      // remote script successfully loaded
      ctlr.run( 'remotefunc' ); 
 }); 

我不会让方法同步。异步执行的全部目的是使执行不会因网络延迟而阻塞。@凯恩:谢谢!将代码放在$.getScript之前,问题仍然存在,尽管我不会使方法同步。异步执行的全部目的是使执行不会因网络延迟而阻塞。@凯恩:谢谢!将代码放在$.getScript之前,但问题仍然存在