根据Google JavaScript风格指南,在块内进行函数声明

Function Declarations Within Blocks according to the Google JavaScript style guide

本文关键字:声明 函数 JavaScript Google 风格 根据      更新时间:2023-09-26

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

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

首先,了解函数声明(function foo() {})被提升到其包含函数的作用域的顶部(即,您可以在与声明相同的作用域中的任何位置按名称访问声明的函数)

foo();
function foo() { }

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

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

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

在另一个函数中包含一个函数不会带来这种混乱:

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

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

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