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

扫描二维码关注公众号,回复: 6254415 查看本文章

let

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

猜你喜欢

转载自www.cnblogs.com/ldnanchao/p/10886128.html