为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2019-03-12 13:12:55
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)为什么能被执行,求指点。
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

在早期(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) 不报错,这应该就涉及到浏览器实现问题,对于我们理解这个问题并不重要。

查看完整回答
反对 回复 2019-03-19
  • 2 回答
  • 0 关注
  • 723 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号