猿问

请问if/etc语句中的函数声明?

if/etc语句中的函数声明?

如何处理函数声明?

var abc = '';if(1 === 0){
    function a(){
        abc = 7;
    }}else if('a' === 'a'){
    function a(){
        abc = 19;
    }}else if('foo' === 'bar'){
    function a(){
        abc = 'foo';
    }} a();document.write(abc); //writes "foo" even though 'foo' !== 'bar'

此示例在Chrome和Firefox中生成不同的输出。铬输出fooFF产出19.


呼如林
浏览 362回答 3
3回答

慕盖茨4494581

当问到这个问题时,ECMAScript 5(ES5)很普遍。在es5的严格模式下,函数声明不能嵌套在if如问题中所示。在非严格模式下,结果是不可预测的。不同的浏览器和引擎为如何处理块内的函数声明实现了自己的规则。到2018年,许多浏览器都支持ECMAScript 2015(ES 2015)函数声明现在允许在块内。..在ES 2015环境中,块内的函数声明将在该块中限定作用域。问题中的代码将导致未定义的函数错误,因为函数a仅在if语句,因此在全局范围内不存在。如果需要有条件地定义函数,则应使用函数表达式.

人到中年有点甜

ECMA-262 v5要求实现在第一次输入任何新的全局或函数级执行上下文时注册所有函数和变量声明。Chrome技术上就在这里,因为它正在查看else和then块和注册a()在处决之前。不幸的是,它产生了最不可读的结果。FF正在等待,直到它在计算之前对if语句进行评估,并将函数和变量声明添加到当前上下文中。顺便说一下。这两个浏览器都是这样做的,在CATCH中,最后是子句。实际上,这只是两个不同的ECMA实现来处理一个不应该出现的特性的问题。当前的场景说明了为什么函数声明不应该在控制流语句中。
随时随地看视频慕课网APP
我要回答