繁体   English   中英

在Chrome和Firefox中使用Javascript吊装

[英]Javascript Hoisting in Chrome And Firefox

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

(function() {

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

    })();

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

为什么不同?

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

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

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

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

同一篇文章还说:

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

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

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

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

这是因为Firefox缺乏功能提升,正如ECMAScript 5中所设想的那样。

Chrome在运行函数体之前正确地为f()赋值,因此f()的第一个版本被第二个版本覆盖。

SpiderMonkey(Firefox的JavaScript引擎)运行代码而不预先为f()赋值,因此它使用在其路上遇到的唯一值: function f() { alert("yes"); }; function f() { alert("yes"); };

什么功能吊装?
JavaScript的函数范围意味着函数内声明的所有变量在函数体中都是可见的。 奇怪的是,这意味着变量在声明之前甚至可见。 JavaScript的这个特性被非正式地称为提升:JavaScript代码的行为就好像函数中的所有变量声明(但不是任何相关的赋值)被“提升”到函数的顶部。

来源:
http://statichtml.com/2011/spidermonkey-function-hoisting.html
2011 - o'reilly - javascript - 权威指南第6版

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM