我最近开始保持别人的JavaScript代码,我正在修复错误,添加功能,也试图更新代码并使其更加一致。
以前的开发人员使用了两种方式来宣布功能,我无法解决是否有原因。
兩種方式是:
var functionOne = function() {
// Some code
};
function functionTwo() {
// Some code
}
使用这两种不同的方法的原因是什么?每个方法的优点和缺点是什么?可以用一种方法做些什么,不能用另一种方法做些什么?
第一個(函數 doSomething(x))應該是對象評分的一部分。
你可能想知道什么是函数声明和函数表达式。
function foo() {
return 3;
}
ECMA 5(13.0)定义合成为函数识别器(FormalParameterListopt ) { FunctionBody }
在上述情况下,函数名称在其范围内和其父母范围内可见(否则它将是不可访问的)。
在函数表达中
函数表达式定义函数作为一个更大的表达式合成的一部分(通常是一个变量任务)。函数表达式可以命名或匿名。
// Anonymous function expression
var a = function() {
return 3;
}
// Named function expression
var a = function foo() {
return 3;
}
// Self-invoking function expression
(function foo() {
alert("hello!");
})();
ECMA 5 (13.0) 定义合成为函数 Identifieropt ( FormalParameterListopt ) { FunctionBody }
在代码维护成本方面,所谓的功能更受欢迎:
无论它们在哪里被宣布(但仍然受到范围限制)。 更抵抗错误,如条件启动(你仍然可以过度排序,如果你愿意)。 代码变得更可读,通过分配地方功能分开的范围功能。 通常在范围内,功能先行,其次是局部功能的声明。
我怀疑更多关于名称功能的PROS正在追踪,而被列为名称功能的优势是匿名功能的缺点。
历史上,匿名函数出现,因为JavaScript作为语言无法列出名为函数的会员:
{
member:function() { /* How do I make "this.member" a named function? */
}
}
要注意的一个重要点是:
让我们有两个功能:
sum(1,2);
const sum = function(first, second) {
return first + second;
}
在上述情況下,它會導致錯誤,金額不被定義,但
sum(1,2);
function sum(first, second) {
return first + second;
}
此函数不会有任何错误,因为在这种情况下会发生 Hoisting。
区别在于,函数One 是一种函数表达式,因此只有在到达该行时才定义,而函数Two 是一种函数声明,并在其周围函数或脚本执行后才定义。
例如,函数表达式:
// TypeError: functionOne 不是函数函数One(); var 函数One = 函数() { console.log(“Hello!”); };
还有一个功能声明:
// 输出: “Hello!”函数Two();函数函数Two() { console.log(“Hello!”); }
“使用严格”; { // 注意此区块! 函数三() { console.log(“Hello!”); } } 函数三(); // 参考错误
第一個(函數 doSomething(x))應該是對象評分的一部分。
你可能想知道什么是函数声明和函数表达式。
function foo() {
return 3;
}
ECMA 5(13.0)定义合成为函数识别器(FormalParameterListopt ) { FunctionBody }
在上述情况下,函数名称在其范围内和其父母范围内可见(否则它将是不可访问的)。
在函数表达中
函数表达式定义函数作为一个更大的表达式合成的一部分(通常是一个变量任务)。函数表达式可以命名或匿名。
// Anonymous function expression
var a = function() {
return 3;
}
// Named function expression
var a = function foo() {
return 3;
}
// Self-invoking function expression
(function foo() {
alert("hello!");
})();
ECMA 5 (13.0) 定义合成为函数 Identifieropt ( FormalParameterListopt ) { FunctionBody }