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)为什么能被执行,求指点。
在早期(es6之前),Block-level 的函数是一个语法错误,但是被浏览器兼容且能够执行。所以你的代码运行环境在 es5, 就会出现这种
foo(4)
的值为 4 的怪异现象。假若我们让代码执行在'use strict'
环境。也就是说,执行完块级作用域后,函数
foo()
就被销毁了。所以,如果要使用 Block-level 函数时,更好的替代是函数表达式。至于为什么在非 strict mode,
foo(4)
不报错,这应该就涉及到浏览器实现问题,对于我们理解这个问题并不重要。参考Block-Level Functions