Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Chrome和Firefox中的Javascript_Javascript_Google Chrome_Firefox_Hoisting - Fatal编程技术网

Chrome和Firefox中的Javascript

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中,结果是“是” 为什么会有差异?在条件语句

在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版