在ES6中新加了快作用域的概念(C语言就有,作为类c语言的js,当然应该加上),算是很好理解。

{
let i;
}
console.log(i);// i is not defined

在代码块当中使用新的作用域。

问题在于for语句

let arr=[];
for(let i=0;i<5;i++){
arr[i]=function(){
console.log(i);
};
}

许多的讲解并没有特别说明它的作用域是怎么看的,似乎是自然而然的事情。

然而对于以前c没专心学,真正会的也就类似PHP,javascript的无块作用域的孩子就觉得疑惑了。

我的错误理解1:

let arr = [];
(function(){//作用域直接包含整个for循环?wrong
for (var i = 0; i < 5; i++) {
arr[i] = function () {
console.log(i);
};
}
})();

我的错误理解2:

let arr = [];
for (var i = 0; i < 5; i++) {
(function () {//作用域包含单次循环?wrong
arr[i] = function () {
console.log(i);
};
})();
}

测试结果都说明自己的理解是有误的,找资料的时候,这里都一笔被带过了(可能因为各位作者都用过块作用域的吧)。

于是想到babel既然是ES6转ES5,理解是正确的,那么可以找它帮忙。

方法,使用babel转码加深特性的理解,

直接在线转码

转码前:

let arr=[];
for(let i=0;i<5;i++){
arr[i]=function(){
console.log(i);
};
i++;
}
console.log(i);//i is undefined
arr[0]();

转码后:

"use strict";

var arr = [];

var _loop = function _loop(_i2) {
arr[_i2] = function () {
console.log(_i2);
};
_i2++;
_i = _i2;
}; for (var _i = 0; _i < 5; _i++) {
_loop(_i);
}
console.log(i); //i is undefined
arr[0]();

通过babel转码后就可以清晰的看出来了:

1、作用域是分成两部分的,在整个for循环外层相当于有一个作用域,这里babel使用变量  _i  来区别   i  变量,等价于一个作用域,在理解上可以这样理解,

let arr = [];
for (let i = 0, len = 5; i < 5; i++) {
arr[i] = function () {
console.log(i);
};
}
console.log(i);
arr[0](); "use strict"; var arr = []; var _loop = function _loop(_i) {
arr[_i] = function () {
console.log(_i);
};
};
(function () {
for (var i = 0; i < 5; i++) {
_loop(i);
}
})();
console.log(i); //i is undefined
arr[0](); "use strict"; var arr = []; (function () {//等价于for循环外层作用域,babel中使用变量别名来优化
var _loop = function _loop(_i2) {
arr[_i2] = function () {
console.log(_i2);
};
_i2++;
i = _i2;
}; for (var i = 0; i < 5; i++) {
_loop(i);
}
})();
console.log(i); //i is undefined
arr[0]();

2、每个单次循环也是一个作用域,代码中的_loop,即是用函数作用域来模拟块作用域。

3、在单次循环中注入了for语句中声明的i变量,并且在一次循环后,将i变量赋值回来(_loop代码中i=_i2)。

运行结果是一样,但是却觉得我的理解很有问题,通常越强大的规则通常是越简单的,是否有更准确的解释呢?求不吝相告

ES6中块作用域之于for语句是怎样的?的更多相关文章

  1. ES6 学习笔记之一 块作用域与let和const

    ---恢复内容开始--- 在学习ES6的块作用域和 let.const 之前,我们先来看看ES5以前的 var 关键字. var 关键字用于定义一个变量,通常我们会将其与变量的赋值合并为一条语句,就像 ...

  2. ES6 学习笔记之二 块作用域与闭包

    "闭包是函数和声明该函数的词法环境的组合." 这是MDN上对闭包的定义. <JavaScript高级程序设计>中则是这样定义的:闭包是指有权访问另一个函数作用域中的变量 ...

  3. ES6 中 let 和 const 总结

    目录 let const 1. let要好好用 1. 基本用法 2. let声明的变量不存在变量提升 3. TDZ(temporal dead zone)暂时性死区 4. 不允许重复声明 2. 块级作 ...

  4. ES6中let和闭包

    在开始本文之前我们先来看一段代码 for(var i=0;i<10;i++){ arr[i]=function(){ return i; } } console.log(arr[3]());// ...

  5. ES6(块级作用域)

    我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...

  6. ES6之块级作用域

    一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...

  7. Javascript中的词法作用域、动态作用域、函数作用域和块作用域(四)

    一.js中的词法作用域和动态作用域      词法作用域也就是在词法阶段定义的作用域,也就是说词法作用域在代码书写时就已经确定了.       js中其实只有词法作用域,并没有动态作用域,this的执 ...

  8. Java 中 try、catch、finally 语句块的执行顺序

    假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...

  9. 理解JavaScript中的作用域和上下文

    JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScrip ...

随机推荐

  1. python之初级学习

    一.python安装 1.下载安装包(本人使用python3.5.1) https://www.python.org/downloads/ 2.安装python-3.5.1.exe 本人下载的是pyt ...

  2. js的match()方法介绍

    定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. ...

  3. VS工具--GhostDoc

    一.介绍:    GhostDoc是Visual Studio的一个免费插件,可以帮助开发人员编写XML格式的注释文档.    C#中XML格式的文档注释好处多多:Visual Studio会在很多地 ...

  4. asp.net Forms身份验证

    Web.config中的配置<system.web><authentication mode="Forms"> <forms name="K ...

  5. jsonp的使用

    假设我们已经了解什么是同源策略,以及什么是浏览器的同源策略的限制. 现在我们需要在a.demo.com下的某个页面one.html 里加载不同域b.demo.com下的json数据. 我们都知道用&l ...

  6. javascript正则表达式

    引用:http://www.jb51.net/article/72192.htm

  7. Python_Day12_python mysql and ORM and redis

    本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令事务  创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql 1. 数 ...

  8. QQ号验证

    №☆★〇█962319751,1611385654,209414856,2729767026,1213235712,1187970122,1393756744,2463317013,346171055 ...

  9. centos6.7 mutlipath install script

    #!/bin/bash if [ `id -g` != 0 ] ;then echo -e "\033[31m Please use root user\033[0m" exit ...

  10. nginx学习记录/2016.11.14

    nginx(engine X)是一个高性能的web服务器和反向代理服务器以及电子邮件代理服务器 由俄罗斯的程序设计师Igor Sysoev所开发 nginx+tomcat实现负载均衡 参考地址:htt ...