谁能解释一下 Internet Explorer 和 Firefox 在以下方面的行为差异:
var myNamespace = (function () {
var exposed = {};
exposed.myFunction = function myFunction () {
return "Works!";
}
console.log(myFunction());
// IE: "Works!"
// Firefox: ReferenceError: myFunction is not defined
console.log(exposed.myFunction());
// IE: "Works!"
// FF: "Works!"
return exposed;
})();
console.log(myNamespace.myFunction());
// IE: "Works!"
// FF: "Works!"
在 Internet Explorer 中,此方法允许我使用 myFunction()
或 exposed.myFunction()
从命名空间函数内部调用我的函数。
在我的命名空间函数之外,我可以使用 myNamespace.myFunction()
在 Firefox 中,除了不起作用的裸命名函数调用外,结果是相同的。
它应该工作吗?如果不应该,那为什么不呢?
如果应该,那么这是一个已知错误吗?
最佳答案
为了防止虚假信息:
IE 的命名函数表达式 有问题,这正是您所拥有的。函数的名称只能在函数的内部 中使用。来自specification :
The Identifier in a FunctionExpression can be referenced from inside the FunctionExpression's FunctionBody to allow the function to call itself recursively. However, unlike in a FunctionDeclaration, the Identifier in a FunctionExpression cannot be referenced from and does not affect the scope enclosing the FunctionExpression.
其中 FunctionExpression 定义为:
FunctionExpression :
function
Identifieropt(
FormalParameterListopt ){
FunctionBody}
但在 IE 中,它不是让名称仅在函数内部可用,而是创建两个不同函数对象,一个分配给变量,另一个分配给您为函数指定的名称。以下将在 IE 中产生 false
(并在其他浏览器中抛出错误):
exposed.myFunction === myFunction;
这是一个已知错误,如果您必须为(旧版本的)IE 编写代码,您最好避免命名函数表达式。
相关问题:
关于Javascript:将命名函数分配给变量时不一致(命名函数表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14732107/