Javascript 如何将可变数量的参数与回调函数一起传递?
我正在使用一个函数延迟加载选择器引擎(由jQuery使用): 我设置了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()
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,你的回答本身就很有教育意义。再次感谢!