let 和 var 引起的闭包面试题

首先闭包的形成的条件:

1.有两个函数

2.两个函数是嵌套关系

3. 内部的函数调用了内部函数的变量

其次变量的查找规则:沿着作用域链逐层往外面查找,直到找到全局的,(属性找不到为undefind,变量为err)

最重要的一句话:js函数在运行的时候在他们被定义的作用域中,而不是被执行的作

下面进入正题,这是一个面试题:

        var a = [];
        for (var i = 0; i < 10; i++) {
            a[i] = function () {
                console.log(i);
            };
        }
        a[1](); //10
        console.log(i) //10
        console.log(a[1]); //function(){console.log(i)} 

使用var声明的变量i ,没有形成一个块级的作用域,所以里面的funciton不能形成一个闭包,每次也不会保存i的值

只有当a[i]()这个函数执行的时候,funciton会沿着作用域链查找i的值,父级作用域就是window,这个时候i已经加到了10

 

        var a = [];
        for (let i = 0; i < 10; i++) {
            a[i] = function () {
                  console.log(i);
            };
        }
        a[6](); //6
        console.log(a[6]); //  function(){console.log(i)} 

let  声明的变量,属于块级作用域,声明周期就在大括号中,在外部是不可以打印的,所以funciton在内部就形成了一个闭包,

funciton里面可以引用父级作用域的变量,引用的就是funciton被定义时的父作用域的变量值

所以在执行a[i] = function () { console.log(i);}的时候 fucniton都保存了当时的i值

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值