函数
函数的创建方式
- 函数通常以函数声明的方式定义(注意函数定义最后没有加分号)
function sum (num1, num2) {
return num1 + num2;
}
- 定义了一个变量并将其初始化为一个函数
let sum = function(num1, num2) {
return num1 + num2;
};
- 箭头函数
let sum = (num1, num2) => {
return num1 + num2;
};
箭头函数
-
参数只有一个时,可以不写小括号
-
可以不用大括号,但这样会改变函数的行为
-
箭头函数不能使用 arguments、super 和 new.target,也不能用作构造函数。此外,箭头函数也没有 prototype 属性。
函数中的参数
-
ECMAScript 函数的参数在内部表现为一个数组。
-
arguments 对象是一个类数组对象(但不是 Array 的实例),因此可以使用中括号语法访问其中的
元素。 -
arguments 对象的另一个有意思的地方就是,它的值始终会与对应的命名参数同步。
-
在使用默认参数时,arguments 对象的值不反映参数的默认值,只反映传给函数的参数。
箭头函数中的参数
如果函数是使用箭头语法定义的,那么传给函数的参数将不能使用 arguments 关键字访问,而只能通过定义的命名参数访问。
默认参数值
在 ECMAScript5.1 及以前,实现默认参数的一种常用方式就是检测某个参数是否等于 undefined,
如果是则意味着没有传这个参数,那就给它赋一个值。ECMAScript 6 之后就不用这么麻烦了,因为它支持显式定义默认参数了。
function makeKing(name = 'Henry') {
return `King ${name} VIII`;
}
默认参数值并不限于原始值或对象类型,也可以使用调用函数返回的值。函数的默认参数只有在函数被调用时才会求值,不会在函数定义时求值。箭头函数同样也可以这样使用默认参数,只不过在只有一个参数时,就必须使用括号而不能省略了。
let romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI'];
let ordinality = 0;
function getNumerals() {
// 每次调用后递增
return romanNumerals[ordinality++];
}
function makeKing(name = 'Henry', numerals = getNumerals()) {
return `King ${name} ${numerals}`;
}
console.log(makeKing()); // 'King Henry I'
console.log(makeKing('Louis', 'XVI')); // 'King Louis XVI'
console.log(makeKing()); // 'King Henry II'
console.log(makeKing()); // 'King Henry III'
默认参数作用域与暂时性死区
在求值默认参数时可以定义对象,也可以动态调用函数,所以函数参数肯定是在某个作用域中
求值的。
参数是按顺序初始化的,所以后定义默认值的参数可以引用先定义的参数。