美文网首页
块级作用域

块级作用域

作者: 文千会 | 来源:发表于2017-11-28 00:00 被阅读0次

    ES5只有全局作用域和函数作用域

    为什么要有块级作用域

    • 防止内层变量覆盖外层变量
      var tmp=new Date();
      function f(){
      console.log(tmp);
      if(false){
      var tmp='hello world'
      }
      }
      f()// undefined 没有块级作用域,然后通过var声明变量导致变量提升,覆盖了外层变量

    • 防止循环变量泄露为全局变量
      都知道for循环 var i=0 相当于在全局变量定义i=0,在循环结束后,并未消失,泄露在全局变量中。

    ES6的块级作用域

    let实际上为JS新增了块级作用域
    function f(){
    let n=5;
    if true(){let n=6}
    console.log(n) //5
    }
    es6允许块级作用域任意嵌套
    {
    {
    {
    let x=2;
    }
    console.log(x) //报错
    }
    }
    块级作用域使得立即执行匿名函数(IIFE)不再必要
    你只需要在想执行的地方:
    {
    let x=....
    xxxxx
    }
    块级作用域与函数声明
    由于现在环境不同,不建议在块级作用域中声明函数,若确实需要请用表达式

    • 允许块级作用域内声明函数
    • 规定是在块级作用域中,函数声明的语句类似let,块级作用域之外不可引用,但为了兼顾ES5,目前函数声明类似var
    • 函数声明会提升到全局作用域/函数作用域头部,同时也会提升到所在块级作用域头部
      do表达式:块级作用域本无返回值,但是加一个do,使其变为do表达式,便可以得到返回值:
      let x={
      let t=f();
      t*t+1;
      }

    相关文章

      网友评论

          本文标题:块级作用域

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