5

谁能解释 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!"

myFunction()在 Internet Explorer 中,此方法允许我通过使用或来从命名空间函数内部调用我的函数exposed.myFunction()

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

在 Firefox 中,结果是相同的,除了不工作的裸命名函数调用。

它应该工作吗?如果不应该,那为什么不呢?

如果应该那么这是一个已知的错误吗?

4

3 回答 3

6

为防止虚假信息:

IE 在命名函数表达式方面存在问题,这就是您所拥有的。函数的名称应该只在函数内部可用。从规范

可以从FunctionExpressionFunctionBody内部引用FunctionExpression中的标识符,以允许函数递归地调用自身。但是,与 FunctionDeclaration 不同,FunctionExpression的标识符不能被引用,也不影响包含FunctionExpression的范围。

其中FunctionExpression定义为:

FunctionExpression :
     function 标识符opt ( FormalParameterList opt ) { FunctionBody }

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

exposed.myFunction === myFunction;

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


相关问题:

于 2013-02-06T15:18:35.660 回答
2

这个:

exposed.myFunction = function myFunction () {
    return "Works!";
}

没用(-纠正自己:这不是不正确的-)并且显然有问题(请参阅Felix的帖子)。如果你想声明一个函数的一部分,exposed你不需要命名它:

exposed.myFunction = function() {
    return "Works!";
}

但是,如果您想声明一个本地函数,然后将其影响到您的数组exposed,您可以执行以下操作:

function myFunction () {
    return "Works!";
}

exposed.myFunction = myFunction;

在这种情况下,这将成功验证(exposed.myFunction === myFunction) === true;

另外,请注意,您的呼叫console.log(myNamespace.myFunction());与您的呼叫相同,console.log(exposed.myFunction());因为myNamespace实际上是 object exposed

于 2013-02-06T15:12:21.223 回答
0

此外,通过定义

exposed.myFunction = function() {}

您将exposed' 的属性设置为myFunction

myNamespace并且在范围内不可用。

通过定义

exposed.myFunction = function myFunction() {}

该函数在 的范围内创建myNamespace,然后作为 的属性引用exposed

于 2013-02-06T15:19:08.877 回答