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中没有"块范围",只是功能范围。 使用您的代码,您推入
使用
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 }); } |