1.定义函数
在JavaScript中,函数实际上是对象。每个函数都是Function类型的实例,而Function也有属性和方法,跟其他引用类型一样。因为函数是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。
常见的定义函数的方式:
(1)函数声明的方式。注意函数定义最后没有加分号。
function sum (num1, num2) {return num1 + num2;
}
(2)函数表达式的方式。这里的定义末尾是有分号的,与任何变量初始化语句一样。
let sum = function(num1, num2) {return num1 + num2;
};
(3)ECMAScript 6 新增了使用胖箭头(=>)语法定义函数表达式的能力。很大程度上,箭头函数实例化的函数对象与正式的函数表达式创建的函数对象行为是相同的,任何可以使用函数表达式的地方,都可以使用箭头函数。而箭头函数简洁的语法非常适合嵌入函数的场景。
let sum = (num1, num2) => {return num1 + num2;
};
2.函数名
因为函数名就是指向函数的指针,所以它们跟其他包含对象指针的变量具有相同的行为,这意味着一个函数可以有多个名称。
例如:
function sum (num1, num2) {return num1 + num2;
}console.log(sum(10, 10)); //20let anotherSum = sum;
console.log(anotherSum(10, 10)); //20sum = null;
console.log(anotherSum(10, 10)); //20
anotherSum和sum都指向同一个函数,调用anotherSum()也可以返回结果,把sum设置为null之后,就切断了它和函数之间的关联,而anotherSum()还是可以照常调用,没有问题。
ECMAScript 6 的所有函数对象都会暴露一个只读的name属性,其中包括关于函数的信息,多数情况下,这个属性中保存的就是一个函数标识符,或者说是一个字符串化的变量名。即使函数没有名称,也会如实显示成空字符串,如果它是用Function构造函数创建的,则会标识成"anonymous"。
function foo() {}
let bar = function() {};
let baz = () => {};console.log(foo.name); //foo
console.log(bar.name); //bar
console.log(baz.name); //baz
console.log((() => {}).name); //(空字符串)
console.log((new Function()).name); //anonymous