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

mic*_*d82 5 javascript firefox internet-explorer cross-browser

任何人都可以解释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!"
Run Code Online (Sandbox Code Playgroud)

在Internet Explorer中这种方法可以让我通过使用调用我的函数从我的命名空间函数内部myFunction()exposed.myFunction().

在我的名字功能之外,我可以使用 myNamespace.myFunction()

在Firefox中,结果是相同的,除了没有用的裸命名函数调用.

应该有用吗?如果不应该,那么为什么不呢?

如果它应该是一个已知的错误?

Fel*_*ing 6

为防止虚假信息:

IE有一个命名函数表达式的问题,这就是你所拥有的.该函数的名称只能在函数内部使用.从规格:

可以从FunctionExpressionFunctionBody内部引用FunctionExpression中标识符,以允许函数递归调用自身.然而,与在FunctionDeclaration,该标识FunctionExpression无法从引用,不影响封闭范围FunctionExpression.

其中FunctionExpression定义为:

FunctionExpression:
     function Identifier opt ( FormalParameterList opt){ FunctionBody }

但是在IE中,它不是使名称仅在函数内部可用,而是创建两个不同的函数对象,一个分配给变量,另一个分配给您给函数的名称.以下将false在IE中产生(并在其他浏览器中抛出错误):

exposed.myFunction === myFunction;
Run Code Online (Sandbox Code Playgroud)

这是一个已知的错误,如果你必须为IE的旧版本编写代码,你最好避免使用命名函数表达式.


相关问题: