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

https://www.runoob.com/js/js-let-const.html

posted @ 2019-05-18 16:20  LDnanchao  阅读(116)  评论(0编辑  收藏  举报