由es6 let想到的块级作用域问题-面试题

面试题情景:
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10
a[7](); // 10
a[8](); // 10
a[9](); // 10

这里好像和想的不那么一样,但是js就是这样,i就是全局变量,所以用来计数的循环变量泄露为全局变量。上面代码中,变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。也可以这样来讲,循环的时候i是没有赋值的,所以a中的值就是function () {console.log(i);};,最终i等于10,所以每次调用输出的都是10.

如果我想输出的是0-9呢?

那么就应该这样:

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

今天我在看let的时候,let为JavaScript新增了块级作用域,用它所声明的变量,只在let命令所在的代码块内有效。

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

我又看了看它编译成es5的样子,这道面试题又多了两个方法,其实重在理解es6的块级作用域和原来的全局作用域。

"use strict";
var a = [];
var _loop = function (i) {
  a[i] = function () {
    console.log(i);
  };
};
for (var i = 0; i < 10; i++) {
  _loop(i);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值