首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据标准,哪种JS函数声明语法是正确的?

根据标准,哪种JS函数声明语法是正确的?
EN

Stack Overflow用户
提问于 2011-04-23 01:16:35
回答 3查看 2.4K关注 0票数 15
  var foo = function(){ return 1; };
  if (true) {
    function foo(){ return 2; }
  }
  foo(); // 1 in Chrome // 2 in FF
  //I just want to be sure, is FF 4 not "standard" in this case?

编辑:

如果我们有这样的结果:

  var foo = function(){ return 1; };
  if (true) function foo(){ return 2; }      
  foo(); // is 1 standard or is 2 standard?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-23 02:02:34

ECMAScript标准不允许原始海报的代码。(出于法律原因,ECMAScript是JavaScript语言规范的正式名称。)然而,它是该语言的一个常见扩展--不幸的是,它在不同的浏览器中实现方式不同。

在标准JavaScript中,函数定义只能出现在顶层代码中,或者出现在函数体的顶层。在封闭函数体和函数定义之间不能有条件、循环,甚至不能有大括号。

例如,这是允许的:

  function f() {
    function g() {
      ...
    }
  }

但这不是:

  function f() {
    {
      function g() {
        ...
      }
    }
  }

让情况变得复杂的是,大多数浏览器都接受后一种代码,但每种浏览器都给它分配了自己独特的解释。Firefox对它的处理方式如下:

  function f() {
    {
      var g = function g() {
        ...
      }
    }
  }

ECMAScript委员会正在考虑为这些“函数语句”(而不是函数定义)选择一种特定的解释。他们还没有做出决定。Mozilla正在讨论其首选的解决方案here

票数 31
EN

Stack Overflow用户

发布于 2011-04-23 02:01:22

问题中的代码实际上根本不被当前的ECMAScript语法所允许(从ECMAScript 5开始)。您可以在块内执行var foo = function() {},但只能在函数或脚本的顶层执行function foo() {}

目前,浏览器以不兼容的方式支持问题中的代码,因为它们都实现了对核心语言的扩展,并且它们实现了不同的扩展。在编译此脚本时,完全符合ECMAScript 5的实现实际上将以SyntaxError结束。

有人提议在ECMAScript中添加这类功能,但它们还没有完全敲定。

票数 16
EN

Stack Overflow用户

发布于 2011-04-23 02:03:06

对于没有在程序顶层或函数体顶层找到的函数声明,没有指定的行为。或者,指定的行为是一个语法错误,因为JavaScript语法不允许这样的函数声明。不同行为的原因是浏览器在历史上一直在这里的地图上,它们仍然如此,因为现有的网站使用浏览器特定的代码路径编写,使得任何人都不可能更改。

无论其价值如何,ECMAScript的未来版本很可能会定义它。但现在你不应该使用它,因为它的行为并不是由规范精确定义的,而且你会在不同的浏览器中得到不同的行为。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5758042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档