关于es6块级作用域内函数声明的问题

foo(1)    //报错

{

    foo(2)    //2

    function foo(v) {

        console.log(v)

    }

    foo(3)    //3

}

foo(4)      // 4


//代码运行环境node9.0

函数声明foo正常情况下在块级作用域内,被提升到声明所在到块级作用域的最上方,所以foo(1)报错,foo(2),foo(3)成功执行,但为什么foo(4)能够执行.

虽然了解es规范为了兼容代码,允许js引擎按照自己的方式执行代码,但还是无法理解foo(4)为什么能被执行,求指点。


德玛西亚99
浏览 724回答 2
2回答

哈士奇WWW

在早期(es6之前),Block-level 的函数是一个语法错误,但是被浏览器兼容且能够执行。所以你的代码运行环境在 es5, 就会出现这种 foo(4) 的值为 4 的怪异现象。假若我们让代码执行在 'use strict' 环境。'use strict'console.log(typeof foo)  // 'undefined'{    foo(2)    //2    function foo(v) {        console.log(v)    }    foo(3)    //3}console.log(typeof foo) // 'undefined'也就是说,执行完块级作用域后,函数 foo() 就被销毁了。所以,如果要使用 Block-level 函数时,更好的替代是函数表达式。foo(1)    //报错{    foo(2)    // 报错    let foo = function (v) {        console.log(v)    }    foo(3)    //3}foo(4) // 报错至于为什么在非 strict mode,foo(4) 不报错,这应该就涉及到浏览器实现问题,对于我们理解这个问题并不重要。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript