这是一个功能声明,表达式和对象吗?

时间:2016-03-04 00:17:06

标签: javascript

我正在学习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




2 个答案:

答案 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的所有权下进行分组。为清楚起见,您可能希望选择此项。