ES6允许块级作用域的任意嵌套

来源:互联网 发布:淘宝福利晒图店家 编辑:程序博客网 时间:2024/05/22 16:57

ES6允许块级作用域的任意嵌套。

{{{{{let insane = 'Hello World'}}}}};

上面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。

{{{{  {let insane = 'Hello World'}  console.log(insane); // 报错}}}};

内层作用域可以定义外层作用域的同名变量。

{{{{  let insane = 'Hello World';  {let insane = 'Hello World'}}}}};

块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数(IIFE)不再必要了。

// IIFE写法

(function () {  var tmp = ...;  ...}());

// 块级作用域写法

{  let tmp = ...;  ...}

另外,ES6也规定,函数本身的作用域,在其所在的块级作用域之内。

function f() { console.log('I am outside!'); }(function () {  if(false) {    // 重复声明一次函数f    function f() { console.log('I am inside!'); }  }  f();}());

上面代码在ES5中运行,会得到“I am inside!”,但是在ES6中运行,会得到“I am outside!”。这是因为ES5存在函数提升,不管会不会进入 if代码块,函数声明都会提升到当前作用域的顶部,得到执行;而ES6支持块级作用域,不管会不会进入if代码块,其内部声明的函数皆不会影响到作用域的外部。

{  let a = 'secret';  function f() {    return a;  }}f(); // 报错

上面代码中,块级作用域外部,无法调用块级作用域内部定义的函数。如果确实需要调用,就要像下面这样处理。

let f;{  let a = 'secret';  f = function () {    return a;  };}f(); // "secret"

ES5的严格模式规定,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)的声明都会报错。

// ES5'use strict';if (true) {  function f() {} // 报错}

ES6由于引入了块级作用域,这种情况可以理解成函数在块级作用域内声明,因此不报错,但是构成区块的大括号不能少,否则还是会报错。

// 不报错'use strict';if (true) {  function f() {}}
// 报错'use strict';if (true)  function f() {}

另外,这样声明的函数,在区块外是不可用的。

'use strict';if (true) {  function f() {}}f(); // ReferenceError: f is not defined

上面代码中,函数f是在块级作用域内部声明的,外部是不可用的。

0 0
原创粉丝点击