我正在学习JavaScript,并且正在尝试学习正在做的事情的正确术语。创建函数的方法有很多种。
我创建了3个做同样事情的例子,但功能是以完全不同的方式创建的。
我的问题是:
这些方法中的任何一种方法都优于其他方法吗?
为什么我会选择这样或那样的方式?
最后一个"对象"方法叫做?
您有什么建议让这个例子更好?
//EXAMPLE 1
// is this called function declaration?
function add( a, b ) {
return a + b;
}
function subtract( a, b ) {
return a - b;
}
function compute( a, b ) {
var sum = add( a, b );
var difference = subtract( a, b );
var total = sum + difference;
return total;
}
compute( 2, 3 ); //returns 4
//EXAMPLE 2
// is this called function expressions?
var add = function ( a, b ) {
return a + b;
};
var subtract = function ( a, b ) {
return a - b;
};
var compute = function ( a, b ) {
var sum = add( a, b );
var difference = subtract( a, b );
var total = sum + difference;
return total;
};
compute( 2, 3 ); //returns 4
//EXAMPLE 3
// what is this method called?
var calculator = {
add: function ( a, b ) {
return a + b;
},
subtract: function ( a, b ) {
return a - b;
},
compute: function ( a, b ) {
var sum = this.add( a, b );
var difference = this.subtract( a, b );
var total = sum + difference;
return total;
}
}
calculator.compute( 2, 3 ); //returns 4

答案 0 :(得分:3)
这叫做函数声明吗?
function add( a, b ) { return a + b; }
是
这叫做函数表达式吗?
var add = function ( a, b ) { return a + b; };
是。请注意,只有function(…){…}
部分是函数表达式,其余部分是正常赋值(带有初始化的变量声明,是迂腐的)。
这个方法叫什么?
… { add: function ( a, b ) { return a + b; }, … }
同样,它是一个函数表达式。在此处用作对象文字中的属性值,以定义方法。
这些方法中的任何一种方法都优于其他方法吗?
函数声明优于将函数表达式赋值给变量(有slight differences)。您应该仅在需要表达式时使用表达式(例如,在IIFE中,条件赋值,属性赋值,属性定义,返回语句等)。
答案 1 :(得分:1)
功能声明:
function add(a,b) { return a+b; }
在解析时为某个脚本块定义函数声明。它可以在块中的任何位置调用而不会产生错误:
(function() {
add(3,3) //The function block has already been parsed, add() is available
function add(a,b) { return a+b; }
})();
函数表达式:
var add = function(a,b) { return a+b; }
函数表达式将变量赋给匿名函数。这些在运行时进行评估,在声明之前无法调用。
(function() {
add(3,3) //Error: add() has not yet been defined.
var add = function(a,b) { return a+b; }
})();
对象方法:
方法,是作为对象属性的函数。
var obj = {
propert1: 'property1 value',
add: function(a,b) {
return a+b;
}
};
这些可以通过obj.add(3,3)
调用,但不能在通过对象文字声明对象或将方法赋值给属性之前调用。
有优惠方式吗?
通过函数声明声明函数提供了灵活性。然而,它可能会导致意外结果,例如(提升函数):
(function returnVal() {
function getSomething() {
return 'foo';
}
return getSomething();
function getSomething() {
return 'bar';
}
})(); //returns 'bar'
函数的返回可能会出现意外,但是在分析时会引发函数,并且会覆盖getSomething()
。
使用函数表达式重写代码会产生所需的结果
(function returnVal() {
var getSomething = function() {
return 'foo';
}
return getSomething();
getSomething = function() {
return 'bar';
}
})(); //returns 'foo'
另一方面,对象方法的作用与函数表达式非常相似,但它们可以在对象的名称下访问。
var obj = {};
obj.foo = function() { /*code*/ }
obj.bar = function() { /*code*/ }
它们的行为类似于函数表达式,但是这些代码在obj
的所有权下进行分组。为清楚起见,您可能希望选择此项。