关于jquery:Javascript如何存储预定义函数(带参数)

Javascript how to store predefined function (with arguments)

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Javascript infamous Loop problem?

我有以下内容:

1
2
3
4
5
6
7
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时将它们绑定到按钮

1
2
3
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函数,但它会在循环中执行,而不是存储它们


闭包可以帮助你。 这是第一段代码的一个解决方案:

1
2
3
4
5
6
7
8
9
10
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的最后一个索引。


使用function.bind

1
2
3
4
5
// 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();

请参阅此处的文档。 注意在Compatability标题下,它解释了如何确保此功能适用于所有目标浏览器(甚至IE的旧版本)。 您可以在那里复制并粘贴代码。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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]();
}

1
2
3
4
5
6
//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
    });
}