我有以下内容:
function test(a,b,c){
console.log(a+b+c);
}
for (var i=0; i < array.length; i++){
steps.push(
function(){ test(array[i].something, array[i].wow, i);}
);
我想存储具有多个参数的函数,并在以后加载DOM时将它们绑定到按钮
for (var i=0; i<steps.length; i++){
$('#mydiv li a').eq(i).click(steps[i]);
}
由于steps [i]包含do(array [i] .something,array [i] .wow,i),所以它并没有真正起作用;而不是做('bob','john',1)例如
我尝试过使用.apply javascript函数,但它会在循环中执行,而不是存储它们
答案 0 :(得分:3)
闭包可以帮到你。这是第一段代码的一个解决方案:
function do(a,b,c){
console.log(a+b+c);
}
for (var i=0; i < array.length; i++){
(function (i) {
steps.push(
function(){ do(array[i].something, array[i].wow, i);}
);
})(i);
}
Javascript中没有“块范围”,只是功能范围。使用您的代码,您推入steps
数组的每个函数都引用了i
的最后一个值,而不是函数被推入steps
时的值。调用一个立即执行的函数使push函数具有一个不会改变的i
值,因为正在创建一个闭包。此闭包的i
值与i
的循环值无关,它将是array
的最后一个索引。
答案 1 :(得分:2)
使用function.bind
。
// Create a new function with null for the `this` object, and 1 and 2 for its arguments.
// Unlike `apply`, you shouldn't enclose the arguments in an array.
var fn = someFn.bind(null, 1, 2, 3, 4);
// This is like calling someFn.apply(null, 1, 2, 3, 4);
fn();
查看文档here。请注意,在 Compatability 标题下,它解释了如何确保此功能适用于所有目标浏览器(即使是IE的旧版本)。您可以在那里复制并粘贴代码。
答案 2 :(得分:0)
//assuming it's always the same function
for (var i=0; i < array.length; i++){
$("#mydiv li a").eq(i).on('click',function() {
// your function here
});
}
答案 3 :(得分:0)
function doSomething(a,b,c){
console.log(a+b+c);
}
functionPrepare(func, args, thisarg) {
return function() { func.apply(thisarg, args); };
)
var steps = [];
for (var i=0; i < array.length; i++) {
steps.push(
functionPrepare(doSomething, [array[i].something, array[i].wow, i])
);
}
// later...
for (var i=0; i<steps.length; i++) {
steps[i]();
}