根据Google JavaScript样式指南在Blocks中的函数声明

时间:2013-07-01 17:09:07

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

根据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.'); };
}

1 个答案:

答案 0 :(得分:21)

功能不是块。一个块(例如)在whileforif之后。

首先,要了解函数声明(function foo() {}被提升到其包含函数范围的顶部(即,你可以在同一个地方的任何地方访问声明的函数)范围作为声明)。:

foo();
function foo() { }

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

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

从语言设计的角度来看,是否应该foo被提升?程序流程永远不会进入程序段,但我们通常会提升所有声明。由于这种混淆,块内的声明不是ECMAScript规范定义的语法的一部分(尽管每个实现都支持这种语法,但在每个实现中都会产生不同的非标准效果)。

在另一个函数中使用函数不会产生这种混淆:

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

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

因此,你的第一个例子非常好。