javasript学习之闭包
闭包
闭包是函数和声明该函数的词法环境的组合。
var list = document.getElementsByTagName("input");
for (var i = 0; i < list.length; i++) {
list[i].onclick=function(){
console.log(i);
}
}
由于闭包的原因会导致输出的值为一样
为什么会这样了
当点击时会回调方法,而i为共享参数。导致回调时,i都为最终结果。
如何解决该问题
var list = document.getElementsByTagName("input");
for (var i = 0; i < list.length; i++) {
list[i].onclick = num(i);
}
function num(index){
return function(){
console.log(index);
}
}
再创建一个闭包,使其调用时,使用闭包的参数,而不是父函数的参数;
每次创建函数都会创建新的变量,而不会使用共享变量。
let关键词
减少闭包的使用
var list = document.getElementsByTagName("input");
for (var i = 0; i < list.length; i++) {
let item = i;
list[i].onclick=function(){
console.log(item);
}
}
这个例子使用let
而不是var
,因此每个闭包都绑定了块作用域的变量,这意味着不再需要额外的闭包。
var与let的区别
var作用域为全局,内部var会影响外部var的值
而let只作用在当前块中,不会影响外部数据。
参考资料
闭包
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
let