gpt4 book ai didi

JavaScript 函数 x(){..} 在 Firefox 中被视为 var x=function(){..} 在 `if' 中,而不是在 Chrome 和 Opera 中

转载 作者:行者123 更新时间:2023-11-29 10:24:13 24 4
gpt4 key购买 nike

考虑以下 JavaScript 代码:

(function(){
foo();
function foo(){ alert('Hello, World!'); }
})();

在 Firefox、Opera 和 Chrome 中,这符合预期;我们收到警报。现在对比:

(function(){
if (true){
foo();
function foo(){ alert('Hello, World!'); }
}
})();

Firefox 3.6 和 4(测试版)(即两者的 SpiderMonkey)抛出异常:foo 未定义

Chrome(即 V8)和 Opera(即 Opera 使用的任何引擎)按我的预期工作。

哪个是正确的行为,还是留给实现来决定?

FWIW,再次将其包装在一个函数中,再次进入 FF 很好:

(function(){
if (true){
(function(){
foo();
function foo(){ alert('Hello, World!'); }
})();
}
})();

最佳答案

根据 the ECMA-262 5th Edition spec , SourceElement 定义为:

SourceElement :
Statement
FunctionDeclaration

因此,FunctionDeclarationStatement 是不同的。 block (例如 if)只能包含 Statement:

Block :
{ StatementList opt }

StatementList :
Statement
StatementList Statement

因此,根据规范,在语法上,if 中没有FunctionDeclarations。然而,根据the comp.lang.javascript FAQ, Mozzila browsers and others implement a "function statement" .这是 ECMA-262 第 3 版和第 5 版第 16 节允许的。Spidermonkey adds FunctionStatement. JScript adds FunctionDeclaration, however, JScript also has JScriptFunction.看起来行为留给实现来决定。

非标准FunctionStatement示例:

try {
function Fze(b,a){return b.unselectable=a}
/*...*/
} catch(e) { _DumpException(e) }

FunctionExpression 示例:

var Fze;
try {
Fze = function(b,a){return b.unselectable=a};
/*...*/
} catch(e) { _DumpException(e) }

函数声明示例:

function aa(b,a){return b.unselectable=a}

关于JavaScript 函数 x(){..} 在 Firefox 中被视为 var x=function(){..} 在 `if' 中,而不是在 Chrome 和 Opera 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com