用闭包
闭包
阮一峰老师讲解闭包的原理
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
example
//error
var a = new Array();
var i;
for(i=0;i<3;i++){
//此处表示a[i] = object(function是一个对象)
a[i] = function(num){
return num;
};
}
console.log(a[2]);
//right
var a = new Array();
var i;
for(i=0;i<3;i++){
// 自执行函数
a[i] = function(num){
return num;
}(i);
}
console.log(a[2]);
存在的问题
settimeout/setInterval无法直接传递参数,如下代码
var temp = 'success';
var foo = function(test) {
alert(test);
};
setTimeout(foo(temp), 3000);
上面的代码执行时,会立即执行foo函数,并将返回值作为setTimeout函数的参数传递,显然是不正确的
解决办法
字符串
setTimeout("foo(temp)",3000);
闭包
定义了一个函数_foo,用于接收一个参数,并返回一个不带参数的函数,在这个函数内部使用了外部函数的参数,从而对其调用,不需要使用参数
var temp = 'success';
function _foo(temp){
return function(){
alert(temp);
};
}
setTimeout(_foo(temp), 3000);