块级作用域和函数

ES5和ES6中对于函数中块级作用域的区别

  • ES5:函数只能在顶级作用域函数作用域中声明,不能在块级作用域中声明

    // 非法声明情况一
    if (true) {
      function f() {}
    }
    
    // 非法声明情况二
    try {
      function f() {}
    } catch(e) {
      // ...
    }
    

    提示:块级作用域;

  • ES6:允许在块级作用域中声明函数,但函数声明的行为类似于let,块级作用域之外不可以使用

  • ES5 vs ES6

    注意在ES6浏览器中有特殊:

    • 允许在块级作用域内声明函数。
    • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
    • 同时,函数声明还会提升到所在的块级作用域的头部。
    // ES5 环境
    function f() { console.log('I am outside!'); }
    
    (function () {
      function f() { console.log('I am inside!'); }//函数作用域中声明
      if (false) {
      }
      f();
    }());
    

    ES5中:得到I am inside!

    //ES6 环境
    function f() { console.log('I am outside!'); }
    
    (function () {
      if (false) {
        // 重复声明一次函数f
        function f() { console.log('I am inside!'); //此时f在代码块内,相当于let声明外部不可以使用
        }
      }
    
      f();
    }());
    

    ES6中:报错;因为ES6中声明类似于var声明,实际是在整个开头将函数f生命诚一个变量f;此时f并不是一个函数因此会报错为VM6105:10 Uncaught TypeError: f is not a function

  • 尽量避免块级作用域中声明函数:

    • 避免会计作用域内声明函数,如必须最好写成函数表达式形式var a = function(){}而不是函数声明语句
    • ES6块级作用域必须有大括号,否则就认为不存在块级作用域
    // 第一种写法,报错
    if (true) let x = 1;
    
    // 第二种写法,不报错
    if (true) {
      let x = 1;
    }
    
    • 严格模式下,函数也只能声明在当前作用域的顶层

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

results matching ""

    No results matching ""