Chrome和Firefox中的Javascript
在Chrome和Firefox中运行此选项会给出不同的答案:Chrome和Firefox中的Javascript,javascript,google-chrome,firefox,hoisting,Javascript,Google Chrome,Firefox,Hoisting,在Chrome和Firefox中运行此选项会给出不同的答案: (function() { if(true) { function f() { alert("yes"); }; } else { function f() { alert("no"); }; } f(); })(); 在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();
报告提供了一些额外的细节:
函数声明只允许出现在程序或函数体中。从语法上讲,它们不能出现在块({…})
-例如if
,while
或for
语句中。这是因为块只能包含语句,而不能包含FunctionDeclaration所定义的SourceElements
同一篇文章还说:
值得一提的是,根据规范,允许实现引入语法扩展(参见第16节),但仍然完全符合规范。这正是这些天在许多客户身上发生的事情。它们中的一些将块中的函数声明解释为任何其他函数声明——只需将它们提升到封闭范围的顶部;其他-引入不同的语义并遵循稍微复杂一些的规则
来自V8(Chrome JavaScript引擎):
不是虫子。Firefox是唯一一款满足您期望的浏览器
Safari和IE在这方面的行为与Chrome/V8相同
这是由于Firefox缺乏ECMAScript 5中所设想的功能 在运行函数体之前,Chrome会正确地为f()赋值, 因此,f()的第一个版本被第二个版本覆盖 SpiderMonkey(Firefox的JavaScript引擎)运行代码时不预先为f()赋值, 因此,它使用了在运行过程中遇到的唯一值:
函数f(){alert(“yes”);}代码>
什么是起重功能?
JavaScript的函数范围意味着函数中声明的所有变量都是可见的
贯穿整个功能体。奇怪的是,这意味着变量是偶数
在声明之前可见。JavaScript的这一特性非正式地称为提升:
JavaScript代码的行为就像函数中的所有变量声明一样(但不是任何变量声明)
相关任务)被“提升”到功能的顶部
资料来源:
2011-o'reilly-javascript-权威指南第6版