6

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

1 回答 1

24

函数不是块。块是(例如)在while,for或 之后的内容if

首先,了解function foo() {}函数声明

foo();
function foo() { }

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

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

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

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

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

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

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

于 2013-07-01T17:16:25.967 回答