settimeout/setInterval传递参数

用闭包

闭包

阮一峰老师讲解闭包的原理
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);