在Chrome和Firefox中使用Javascript吊装

Bil*_*llR 11 javascript firefox google-chrome hoisting

在Chrome和Firefox中运行此功能会给出不同的答案:

(function() {

        if(true) {
            function f() { alert("yes"); };
        } else {
            function f() { alert("no"); };
        }
        f();

    })();
Run Code Online (Sandbox Code Playgroud)

在Chrome中,结果是'不'在Firefox中,结果为'是'

为什么不同?

bfa*_*tto 12

在条件语句中声明函数是非标准的,所以不要这样做.这是一个众所周知的问题.您可以使用函数表达式而不是声明:

var f;
if(true) {
    f = function() { alert("yes"); };
} else {
    f = function() { alert("no"); };
}
f();
Run Code Online (Sandbox Code Playgroud)

关于函数表达式着名Kangax文章提供了一些额外的细节:

FunctionDeclarations只允许出现在ProgramFunctionBody中.从语法上讲,它们不能出现在Block中 ({ ... }) - 例如if,while或者for语句.这是因为只能包含声明,不是SourceElements,这FunctionDeclaration是.

同一篇文章还说:

值得一提的是,根据规范,允许实现引入语法扩展(参见第16节),但仍然完全符合要求.这正是现在这么多客户所发生的事情.其中一些将块中的函数声明解释为任何其他函数声明 - 只需将它们提升到封闭范围的顶部; 其他 - 引入不同的语义并遵循稍微复杂的规则.


Kon*_*nel 5

来自V8(Chrome JavaScript引擎)错误跟踪器:

不是错误.Firefox是唯一能够满足您期望的浏览器.

Safari和IE的行为与Chrome的/ V8相同.