zoukankan      html  css  js  c++  java
  • 《理解 ES6》阅读整理:函数(Functions)(七)Block-Level Functions

    块级函数(Block-Level Functions)

    在ES3及以前,在块内声明一个函数会报语法错误,但是所有的浏览器都支持块级函数。不幸的是,每个浏览器在支持块级函数方面都有一些细微的不同的行为。所以开发者最好不要在块内声明函数。为了解决浏览器在块内支持声明函数时带来的兼容性问题,在ES5中可以使用strict模式,这样如果开发者试图定义一个块内函数,就会报错:

    "use strict";
    
    if (true) {
        //throws a syntax error in ES5
        function soSomething() {
            //...
        }
    }

    在ES6中,上面的doSomething函数是一个块级函数,并且可以在同一块内调用:

    "use strict";
    
    if (true) {
        console.log(typeof doSomething);  //  "function"
    
        function doSomething() {
            //...
        }
    
        doSomething();
    }
    
    console.log(typeof doSomething);  //  "undefined"

    上面的代码中,doSomething被提升到块顶部,在块外不能被访问到。

    决定何时使用块级函数(Deciding When to Use Block-Level Functions)

    块级函数与let函数表达式相似,当代码执行出块后,函数的定义就被移除了。两者的区别是块级函数会被提升到块的顶部,而let函数表达式则不会。参见下面的例子:

    "use strict";
    
    if (true) {
        console.log(typeof doSomething);  //  "error"
    
        let doSomething  = function() {
            //...
        }
    
        doSomething();
    }
    
    console.log(typeof doSomething);  //  "undefined"

     ES6中也可以在non-strict模式下定义块级函数,但是跟在strict模式下会有不同。块级函数会被提升到整个函数顶部或者全局环境中:

    if (true) {
        console.log(typeof doSomething);  //  "function"
    
        let doSomething  = function() {
            //...
        }
    
        doSomething();
    }
    
    console.log(typeof doSomething);  //  "function"

    在这个例子中,doSomething函数会被提升到全局作用域中,因此上面两处都会输出function。

  • 相关阅读:
    一、
    一、AJAX
    一、RequireHttps
    【2019-08-23】被环境影响时,想想初心
    【2019-08-22】任何收获,是需要成本的
    【2019-08-20】有点目标,有点计划,有点目的
    【2019-08-21】承认自己错误,就是正确的开始
    【2019-08-19】新,是一种魔力
    【2019-08-18】时间是有密度的
    【2019-08-17】工作太多是适得其反
  • 原文地址:https://www.cnblogs.com/xfshen/p/5997986.html
Copyright © 2011-2022 走看看