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

标签 javascript internet-explorer firefox 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!"

在 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/

相关文章:

Scala.js 中的 Javascript 生成器

html - 文本不会仅在 IE 上显示

javascript - 如何找到呈现 HTML 页面需要多长时间?

python - 在 App Engine 处理程序上接收来自 Firefox 12.0 的多个 HTTP 请求

selenium - org.openqa.selenium.SessionNotCreatedException : Unable to find a matching set of capabilities while initiating Firefox v37 through Selenium v3. 11.0

javascript - Summernote 字体系列和颜色不起作用

c# - Javascript与C#交叉编译转换

html - UL 样式表未在 IE 中换行

firefox - 将 Firefox 插件安装到 Firefox OS Firefox 浏览器中

javascript - Firebase 云函数对象更新创建递归