每个函数都是Function类型的实例,而Function也有属性和方法。
因为函数是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。
函数的定义方式:
① 通常以函数声明的方式定义:
function sum(num1, num2) {return num1 + num2;}
注: 函数定义最后没有分号
② 另一种定义函数的语法是函数表达式。
函数表达式与函数声明几乎是等价的:
let sum = function(num1, num2) {return num1 + num2;}
代码定义了一个变量sum并将其初始化为一个函数。这个函数可以通过变量sum来引用。
注:这里的函数末尾有分号,与任何变量初始化语句一样。
③ 定义函数的方式与函数表达式很像,叫作“箭头函数”(arrow function)
let sum = (num1, num2) => {return num1 + num2;};
④ 最后一种定义函数的方式是使用Function构造函数(不推荐)
let sum = new Function('num1', 'num2', 'return num1 + num2');
不推荐用这种语法来定义函数,原因:
这段代码会被解释两次:第一次是将它当作常规ECMAScript代码,第二次是解释传给构造函数的字符串。影响性能。
优点:把函数想象为对象,把函数名想象为指针是很重要的。而上面这种语法很好地诠释了这些概念。
注:这几种实例化函数对象的方式之间存在微妙但重要的差别,但通过其中任何一种方式都可以创建函数。
