【问题标题】:Function Declarations Within Blocks according to the Google JavaScript style guide根据 Google JavaScript 样式指南,块内的函数声明
【发布时间】:2013-07-01 17:09:06
【问题描述】:

根据 Google JavaScript 风格指南,函数声明不应在块内声明,因为这不是 ECMAScript 的一部分。但是,我并不完全清楚什么是块。

具体来说,我有一个构造函数,我想在该构造函数的范围内定义一个函数。由于它位于一组 {} 中,这是否算作一个块中的函数?如果是这样,这是否意味着每个函数声明都必须是全局的?

一些好的衡量标准:

错误 (?)

function Constructor() {
    function Shout () { alert('THE BEST UX IS IN ALL CAPS.'); }
}

正确 (?)

function Constructor() {
    var Shout = function () { alert('THE BEST UX IS IN ALL CAPS.'); };
}

【问题讨论】:

标签: javascript ecmascript-5 google-style-guide


【解决方案1】:

函数不是块。块是(例如)whileforif 之后的内容。

首先,了解函数声明 (function foo() {}) 被提升 到其包含函数范围的顶部(即,您可以在与声明)。:

foo();
function foo() { }

这个乱序代码是 100% 合法的,因为 foo 的声明被提升到 foo() 调用之上。但是,现在假设您有一个条件声明:

if(false) {
    function foo() { }
}

从语言设计的角度来看,foo 应该被提升吗?程序流永远不会进入块,但我们习惯性地提升 all 声明。由于这种混淆,块内的声明不是 ECMAScript 规范定义的语法的一部分(尽管每个实现都支持这种语法,但会导致不同的、非标准的效果)。

在另一个函数中包含一个函数不会造成这种混淆:

function bar() {
    function foo() { }
}

很明显foo 将被提升到bar 的顶部(无论何时运行)。

因此,您的第一个示例非常好。

【讨论】:

  • 是这样想的。那么什么定义了块呢? Google 搜索表明 {} 是块。这意味着明显的块 if、else、for、while、try、catch。但是功能是模棱两可的。
  • @MatthewJamesDavis 函数总是有 function 关键字,后跟有时是可选的标识符,后跟带有可选参数列表的括号,然后是带有函数体的大括号。所以这不是模棱两可的。但是,空块与空对象字面量是模棱两可的。
  • @MatthewJamesDavis bfavaretto 说得很清楚,但我会尝试重申:当花括号是对象文字或函数定义的一部分时,它们表示块 except/表达。我知道这似乎有点重言式,但这就是规范所说的。我刚刚进行了搜索,我同意你的观点,很难找到关于这个主题的明确参考;无论如何,现在你知道事情的真相了!
猜你喜欢
  • 2016-08-04
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多