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) 不报错,这应该就涉及到浏览器实现问题,对于我们理解这个问题并不重要。
添加回答
举报
0/150
提交
取消