美文网首页
ECMAScript6学习笔记-D2 块级作用域

ECMAScript6学习笔记-D2 块级作用域

作者: 福兮祸所依 | 来源:发表于2017-07-12 21:43 被阅读0次

let实际上为 JavaScript 新增了块级作用域


用let命令声明的变量,外层代码块不受内层代码块的影响:

function f1() {
    let n = 5;
    var m = 5;
    if (true) {
        let n = 5;
        var m = 10;
    }
    console.log(n); // 5
    console.log(m); // 10
}
f1();

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 = 3;
    console.log(tmp);
}());
// 块级作用域写法
{
     let tmp = 5;
     console.log(tmp);
}

块级作用域与函数声明

ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。

// 情况一
if (true) {
  function f() {}
}
// 情况二
try {
  function f() {}
} catch(e) {
  // ...
}
//上面两种函数声明,根据 ES5 的规定都是非法的。但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数,因此上面两种情况实际都能运行,不会报错

ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。函数本身的作用域,在其所在的块级作用域之内:

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

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

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

相关文章

  • ECMAScript6学习笔记-D2 块级作用域

    let实际上为 JavaScript 新增了块级作用域用let命令声明的变量,外层代码块不受内层代码块的影响: E...

  • ECMAScript6学习笔记-D2 块级作用域

    let实际上为 JavaScript 新增了块级作用域 用let命令声明的变量,外层代码块不受内层代码块的影响: ...

  • es6学习笔记

    《ECMAScript6 入门》阮一峰 读书笔记 let和constlet声明的变量仅在块级作用域内有效,var声...

  • 《深入理解ES6》学习笔记(第三天)

    《深入理解ES6》学习笔记(第三天) 第一章 块级作用域绑定 第2节 块级声明块级声明用于声明在指定块的作用域之外...

  • js 作用域

    js 作用域主要有:全局作用域和局部作用域,es5之前没有块级作用域,es6有了块级作用域 何为块级作用域,块级作...

  • let、const和var的区别(个人笔记)

    1. 区别 (1)块级作用域块作用域由{ }包括,let和const具有块级作用域,var不存在块级作用域。块级作...

  • let,var和const

    var没有块级作用域,只有方法作用域常见的块级作用域,if(){}。for(){}。

  • 第七章 块级作用域、私有变量

    模仿块级作用域 私有变量  js没有块级作用域,只有全局作用域和局部作用域(函数作用域),块级作用域是指某一部分代...

  • 你真的懂let和const吗?

    块级作用域 在ES6之前我们脑海里应该只存在全局作用域和函数级作用域,没有块级作用域。那么为什么要引入块级作用域呢...

  • js高级知识点(第五天)

    所用域 什么是作用域 变量起作用的范围 什么是块级作用域,使用代码块限定的作用域是块级作用域(let声明的变量是块...

网友评论

      本文标题:ECMAScript6学习笔记-D2 块级作用域

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