可能重复:
Javascript closure inside loops - simple practical example
我正在尝试使用自调用函数,以便objects
中的每个函数都会返回不同的消息。
<script type="text/javascript">
objects = {};
for( var i = 0; i < 10; i++ ) {
objects['function'+i] = function () {
var text = ( function() { return "I am object " + i; } )();
return text;
};
}
for( var j = 0; j < 10; j++ ) {
document.write( objects['function'+j]() + "<br>" );
}
</script>
到目前为止,上述结果为:
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
我是对象10
如何使用自我调用函数立即设置消息,而不是与不稳定的i
绑定?
答案 0 :(得分:8)
您需要传入迭代器变量,以便匿名函数可以将其存储在自己的激活对象 / 词法环境中记录(=在其自己的上下文对象中)。
此外,您需要此匿名函数来包装所有访问点:
objects[ 'function' + i ] = function( i ) {
var text = function() { return "I am object " + i; };
return text;
}( i );
答案 1 :(得分:1)
您需要针对该特定i
变量构建closure,结束,并返回从i
解开的函数:
for (var i = 0; i < 10; i++) {
objects['function'+i] = ( function (num) {
return function() {
var text = "I am object " + num;
return text;
};
} )( i ); // <== put the variable into the self-invoking function
}
答案 2 :(得分:0)
你需要一个闭包..请参阅King Resig在这里的解释http://ejohn.org/apps/learn/#59以获得解释。但是要使这个代码工作,你必须确保在调用函数时保持i的值...所以它会像
http://jsbin.com/uveluw/1/edit
for( var i = 0; i < 10; i++ ) (function(i){
objects['function'+i] = function () {
var text = ( function() { return "I am object " + i; } )();
return text;
};
})(i)
答案 3 :(得分:0)
立即执行返回值,以便在循环中关闭i:
objects = {};
for( var i = 0; i < 10; i++ ) {
objects['function'+i] = (function () {
var text = ( function() { return "I am object " + i; } )();
return text;
})();
}
for( var j = 0; j < 10; j++ ) {
console.log( objects['function'+j] );
}