Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.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_Function_Parameters_Callback_Arguments - Fatal编程技术网

Javascript 如何将可变数量的参数与回调函数一起传递?

Javascript 如何将可变数量的参数与回调函数一起传递?,javascript,function,parameters,callback,arguments,Javascript,Function,Parameters,Callback,Arguments,我正在使用一个函数延迟加载选择器引擎(由jQuery使用): 我设置了onload和onreadystatechange事件处理程序,以及sizzle\u loaded标志,以便在sizzle加载后调用另一个函数(gather\u content())。要以跨浏览器的方式实现这一点,需要所有这些 到目前为止,我的项目只需在脚本中的某一点延迟加载Sizzle,因此我能够将gather\u content()函数调用硬编码到load\u Sizzle()函数中 function example()

我正在使用一个函数延迟加载选择器引擎(由jQuery使用):

我设置了
onload
onreadystatechange
事件处理程序,以及
sizzle\u loaded
标志,以便在sizzle加载后调用另一个函数(
gather\u content()
)。要以跨浏览器的方式实现这一点,需要所有这些

到目前为止,我的项目只需在脚本中的某一点延迟加载Sizzle,因此我能够将
gather\u content()
函数调用硬编码到
load\u Sizzle()
函数中

function example() {
for( var i = 0; i < arguments.length; i++ ) {
    alert('argument ' + i + ' ' + arguments[i]);
}
}

example('any', 'number', 'of', 'arguments);
但是,我现在需要在脚本中的两个不同点延迟加载Sizzle,并在加载后调用不同的函数。我的第一反应是修改函数以接受回调函数:

var sizzle_loaded;

// load the Sizzle script
function load_sizzle(module_name, callback) {

  var script;

  // load Sizzle script and set up 'onload' and 'onreadystatechange' event
  // handlers to ensure that external script is loaded before dependent
  // code is executed
  script = document.createElement('script');
  script.src = 'sizzle.min.js';
  script.onload = function() {
    sizzle_loaded = true;
    callback(module_name);
  };
  script.onreadystatechange = function() {
    if ((script.readyState === 'loaded' || script.readyState === 'complete') &&
        !sizzle_loaded) {
      sizzle_loaded = true;
      callback(module_name);
    }
  };

  // append script to the document
  document.getElementsByTagName('head')[0].appendChild(script);

}
然后,我可以这样称呼它:

load_sizzle(module_name, gather_content);
但是,我需要使用的另一个回调函数使用的参数比
gather\u content()

我如何修改我的函数,以便我可以指定一个可变数量的参数,与回调函数一起传递?或者,我是不是走错了路

最后,我只想加载Sizzle,然后在加载完成后调用任何需要的函数(使用它需要的任何参数)


谢谢你的帮助

这里的总体思路是创建一个闭包或lambda。在某种程度上,您可以将它们视为一个函数,它预先装入准备调用的参数。这有时也称为委托

load_sizzle( module_name, function()
{
  gather_content();
});
那么,你的另一个案子呢

load_sizzle( module_name, function()
{
  some_other_function( param1, param2 );
});

更多阅读。

您可以在回调上使用apply方法:

function load_sizzle(module_name, callback,args) {

  var script, args=args || []; //Be sure that an array is passed

  // load Sizzle script and set up 'onload' and 'onreadystatechange' event
  // handlers to ensure that external script is loaded before dependent
  // code is executed
  script = document.createElement('script');
  script.src = 'sizzle.min.js';
  script.onload = function() {
    sizzle_loaded = true;
    callback.apply(window,[module_name].concat(args)); //Add the module_name as first argument and then every other argument specified by the user
  };
  script.onreadystatechange = function() {
    if ((script.readyState === 'loaded' || script.readyState === 'complete') &&
        !sizzle_loaded) {
      sizzle_loaded = true;
      callback(module_name);
    }
  };

  // append script to the document
  document.getElementsByTagName('head')[0].appendChild(script);

}
然后作为load_sizzle的第三个参数,您可以为函数传递一个额外参数数组

function example() {
for( var i = 0; i < arguments.length; i++ ) {
    alert('argument ' + i + ' ' + arguments[i]);
}
}

example('any', 'number', 'of', 'arguments);
您还可以通过以下方法改进代码:

function load_sizzle(module_name, callback,args,bind) {

  var script, args=args || [],bind=bind || window;

  // load Sizzle script and set up 'onload' and 'onreadystatechange' event
  // handlers to ensure that external script is loaded before dependent
  // code is executed
  script = document.createElement('script');
  script.src = 'sizzle.min.js';
  script.onload = function() {
    sizzle_loaded = true;
    callback.apply(bind,[module_name].concat(args)); //Add the module_name as first argument and then every other argument specified by the user
  };
  script.onreadystatechange = function() {
    if ((script.readyState === 'loaded' || script.readyState === 'complete') &&
        !sizzle_loaded) {
      sizzle_loaded = true;
      callback(module_name);
    }
  };

  // append script to the document
  document.getElementsByTagName('head')[0].appendChild(script);

}

这样,参数编号4(如果指定)可以是一个对象,该对象将是您传递的回调中的“this”。

您可以使用参数数组获取传递到函数中的所有参数

function example() {
for( var i = 0; i < arguments.length; i++ ) {
    alert('argument ' + i + ' ' + arguments[i]);
}
}

example('any', 'number', 'of', 'arguments);
函数示例(){
for(var i=0;i
非常感谢,mck89!我最终选择了Peter Bailey的解决方案(对我来说,它看起来更优雅,需要更少的代码更改)。然而,FWIW,你的回答本身就很有教育意义。再次感谢!