根据Google JavaScript风格指南,在块内进行函数声明
Function Declarations Within Blocks according to the Google JavaScript 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.'); };
}
函数不是块。块是(例如)while
、for
或if
之后的块。
首先,了解函数声明(function foo() {}
)被提升到其包含函数的作用域的顶部(即,您可以在与声明相同的作用域中的任何位置按名称访问声明的函数)
foo();
function foo() { }
这种无序代码是100%合法的,因为foo
的声明被提升到foo()
调用之上。然而,现在假设您有一个条件声明:
if(false) {
function foo() { }
}
从语言设计的角度来看,foo
应该被吊起来吗?程序流永远不会进入块,但我们习惯于提升所有声明。由于这种混淆,块内的声明不是ECMAScript规范定义的语法的一部分(尽管每个实现都支持这种语法,但在每个实现中都会产生不同的非标准效果)。
在另一个函数中包含一个函数不会带来这种混乱:
function bar() {
function foo() { }
}
很明显,foo
将被提升到bar
的顶部(无论何时运行)。
因此,你的第一个例子非常好。
相关文章:
- Eval未声明函数
- JavaScript + mocha:可能是在 for 循环中声明函数的闭包问题
- 使用 .on 函数运行 jQuery 声明函数
- 返回并重新声明函数中的变量
- SyntaxError:严格模式不允许在词法嵌套语句中声明函数
- JavaScript函数的类型是在声明函数之前定义的
- 在 initComponent Ext JS4 中声明函数
- 在对象中声明函数名称,为什么
- 在变量中声明函数的不同方法
- 声明函数是否会创建具有函数名称和分配给它的函数对象的变量
- 在 angularjs 控制器范围内声明函数和属性,但不附加到$scope
- 在声明函数中使用“this”时严格违规,函数表达式不违规
- 只有从html set onclick事件调用代码声明函数时,该函数才不存在
- 在jQuery中动态声明函数
- 声明函数并在jquery事件绑定上调用它
- 在Javascript中声明函数的最有效方法是什么
- javascript声明函数超时
- Javascript:动态声明函数的正确方法
- 为闭包声明函数两次
- 习语Javascript编码风格-何时在原型上声明函数,何时在函数构造函数内声明函数