//JavaScript闭包 var array = [1, 2, 3]; var funcs = new Array(3); for (var i in array) { var tmp = array[i]; funcs[i] = function () { return tmp; } } alert(funcs[0]());
会输出3!原因是JavaScript中函数中的所有变量声明作用域都是在整个函数中的。因此这个tmp就是这个函数域中的全局变量,当for循环运行完毕后,tmp就是3了。funcs数组中的所有函数对象返回值都会是3。
那么怎样解决JavaScript的这个问题呢?
我们可以利用另一个辅助函数来返回闭包函数。把原来函数域中的全局变量tmp传入到另一个函数中后,在这个函数中返回另一个函数来返回这个tmp变量(这句话有点绕推荐直接看下面代码)。这样做的意义是,之前函数中的tmp变量现在被局部化了。
完整代码:
//JavaScript闭包 function makeFunc(item) { return function () { return item; } } var array = [1, 2, 3]; var funcs = new Array(3); for (var i in array) { var tmp = array[i]; funcs[i] = makeFunc(tmp); } alert(funcs[0]());
这样就会输出1了!