深入剖析let/const在for循环中的作用原理

作者: e042cbe4da21 | 来源:发表于2017-03-17 11:26 被阅读270次

1、先来看一个例子

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

2、再来看一下For循环的过程

for (语句 1; 语句 2; 语句 3)
{
  被执行的代码块
}
// 语句 1 在循环(代码块)开始前执行
// 语句 2 定义运行循环(代码块)的条件
// 语句 3 在循环(代码块)已被执行之后执行

3、例子for循环执行过程伪代码如下:

var a=[]
var i = 0;

if(i<3) {
  a[i]=function(){console.log(i)}  
}
i++;

if(i<3) {
  a[i]=function(){console.log(i)}  
}
i++;

if(i<3) {
  a[i]=function(){console.log(i)}  
}
i++;

/* 数组a此时的状态
a = [
  function(){console.log(i)},
  function(){console.log(i)},
  function(){console.log(i)}
]
*/

// a[1] = function(){console.log(i)}

a[1](); // 打印3,因为i现在的值是3

注:“i现在的值是3”这句话在某种意义上是不准确的,
从作用域链的角度来说a[1]在它的if{}块作用域内没有找到i,
要去上一级作用域局部作用域中找,这时候找到了i,
而局部作用域中i现在的值是3。

4、如果把for循环的var换成let

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

// 执行过程
var a=[]
let i = 0;

if(i<3) {
    let i = i;
    a[i]=function(){console.log(i)}  
}
i++;

if(i<3) {
    let i = i;
    a[i]=function(){console.log(i)}  
}
i++;

if(i<3) {
    let i = i;
    a[i]=function(){console.log(i)}   
}
i++;

// console.log(i)在其块级作用域内就找到了i,
每次for循环把当前i值存入块级作用域。
所以a[1]()会打印1;

相关文章

  • 深入剖析let/const在for循环中的作用原理

    1、先来看一个例子 2、再来看一下For循环的过程 3、例子for循环执行过程伪代码如下: 4、如果把for循环的...

  • ES6

    一、let和const 1.let 在 js/es6 中,用let在for循环中声明的变量,在外部无法访问 let...

  • ES6

    let const let const 没有变量提升let 块级作用域const 常量 模板语言, restfu

  • ECMAScript6--2.基本语法let 和 const

    1.let 和 const 2.作用域的概念* 全局作用域* 函数作用域* 块作用域--let和const是在块作...

  • let和const

    关于let和const的一些疑问 1. for循环中的特例(1)使用let,声明的变量仅在块级作用域内有效 上面代...

  • ES6 let var const解析

    let 和 var,const let声明的变量只在let所在的代码块有效 for循环中,var声明的是全局的,l...

  • ES6

    ①const和let var 只有 全局作用域 和 函数作用域 没有块级作用域 { }let 、 const...

  • es6解读1: let, const 和 smybol

    let const 作用域 作用域概念 如何使用let和const 使用let 形成块级作用域 es6下强制开启...

  • ES6学习

    1、 var let const var是函数作用域let和const是块级作用域,!const是常量,不能改变。...

  • ES6新特性

    块作用域 let和const有关let 关键字(只在{}作用域内有用)const 关键字(常量也用于块即作用符 ...

网友评论

    本文标题:深入剖析let/const在for循环中的作用原理

    本文链接:https://www.haomeiwen.com/subject/oohenttx.html