我最近开始保持别人的JavaScript代码,我正在修复错误,添加功能,也试图更新代码并使其更加一致。
以前的开发人员使用了两种方式来宣布功能,我无法解决是否有原因。
兩種方式是:
var functionOne = function() {
// Some code
};
function functionTwo() {
// Some code
}
使用这两种不同的方法的原因是什么?每个方法的优点和缺点是什么?可以用一种方法做些什么,不能用另一种方法做些什么?
对格雷格的答案有更好的解释
functionTwo();
function functionTwo() {
}
為什麼沒有錯誤?我們總是被教導,表達從上到底(??)
因为:
函数声明和变量声明总是由JavaScript翻译器无视地移动到其内容范围的顶部。
这就是这样的代码:
functionOne(); --------------- var functionOne;
| is actually | functionOne();
var functionOne = function(){ | interpreted |-->
}; | like | functionOne = function(){
--------------- };
请注意,提交声明的部分未被提交;只有名称被提交。
但是,在函数声明的情况下,整个函数身体也将被包围:
functionTwo(); --------------- function functionTwo() {
| is actually | };
function functionTwo() { | interpreted |-->
} | like | functionTwo();
---------------
你在那里发布的两个代码剪辑,几乎所有目的都会以相同的方式行事。
然而,行为的差异是,在第一个变量(有函数One = 函数() {}),该函数只能在代码中的那个点之后被称为。
第二个选项(函数Two()),函数可用于代码,运行在函数被宣布的地方。
这是因为第一种变量,函数在运行时分配给变量foo;第二种函数在运行时分配给这个识别器,foo。
更多技术信息
JavaScript 有三种方式来定义功能。
你的第一个剪辑显示一个函数表达式. 这意味着使用“函数”操作员创建一个函数 - 该操作员的结果可以存储在任何变量或对象属性. 函数表达式是强大的这种方式. 函数表达式经常被称为“匿名函数”,因为它不需要一个名字, 你的第二个例子是一个函数声明。
在代码维护成本方面,所谓的功能更受欢迎:
无论它们在哪里被宣布(但仍然受到范围限制)。 更抵抗错误,如条件启动(你仍然可以过度排序,如果你愿意)。 代码变得更可读,通过分配地方功能分开的范围功能。 通常在范围内,功能先行,其次是局部功能的声明。
我怀疑更多关于名称功能的PROS正在追踪,而被列为名称功能的优势是匿名功能的缺点。
历史上,匿名函数出现,因为JavaScript作为语言无法列出名为函数的会员:
{
member:function() { /* How do I make "this.member" a named function? */
}
}