gpt4 book ai didi

Javascript:将命名函数分配给变量时不一致(命名函数表达式)

转载 作者:数据小太阳 更新时间:2023-10-29 06:02:43 25 4
gpt4 key购买 nike

谁能解释一下 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/

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