es6中添加块级作用域的目的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es6中添加块级作用域的目的相关的知识,希望对你有一定的参考价值。

 原本只有函数作用域和全局作用域两种,这就导致出现很多不方便的地方:

1)for循环问题:在看js高程的时候,纠结在第七章好久,就是一个这样的实例

function createFunctions(){
    var result = new Array();
    for (var i = 0 ; i < 10 ; i ++){
      result[i] = function (){
         return i;
      }  
    }
    return result;
}

  不管这段代码输出result[i]()中的i是几,结果都是10,这就是没有块级作用域的一个弊端。因为变量i是全局变量,每次循环都是对同一个i变量进行操作,导致覆盖,所以最后无论对result数组中的哪个函数进行执行,结果都是输出10;

2)内外成变量的覆盖问题

var a = 10;
function f(){
  console.log(a);
  var a = 20;
}

  执行结果是undefined,这是因为内层变量a对外层同名变量覆盖了,上述代码由于声明被提升,相当于下面这样写:

var a = 10;
function f(){
  var a;
  console.log(a);
  a = 20;
}

  由于内层函数作用域的存在,新声明的a是undefined,会被输出。


考虑到上述两种问题,加入了块级作用域,比如将for循环中的var i 改为let i,就会输出预期的结果;第二个例子中涉及到let和块级作用域绑定,存在暂时死区问题,若只将内层var换成let,会出现referenceError错误,即let声明不同于var,声明前不可获取,所以出错。若感兴趣,可再自行查阅。

以上是关于es6中添加块级作用域的目的的主要内容,如果未能解决你的问题,请参考以下文章

ES6里关于作用域的拓展:块级作用域

ES6 之 let和const块级作用域

ES6的块级作用域

关于ES6

面试时面试官想要听到什么答案 关于es6中letconstpromise块级作用域的问题

js作用域的相关知识