高阶函数是接受另一个函数作为参数或返回一个函数作为返回值或两者兼有的函数。
代码语言:javascript复制const firstOrderFunc = () => console.log('hello, i am a first order function');
const higherOrder = (ReturnFirstOrderFunc) => ReturnFirstOrderFunc();
higherOrder(firstOrderFunc);
复制代码
理解参数
在ECMAScript函数的参数在内部表现为一个数组。函数被调用时总会接收一个数组,但函数并不关心这个数组中包含什么。如果数组中什么也没有,那没问题;如果数组的元素超出了要求,那也没问题。
如果使用function关键字定义(非箭头)函数时,可以在函数内部访问arguments对象,从中取得传进来的每个参数值。
arguments对象时一个类数组对象,因此可以使用中括号语法访问其中的元素。而确定传进来多少个参数,可以访问arguments.length属性。(通过arguments对象的length属性传入的参数个数)
箭头函数中的参数
如果函数是使用箭头语法定义的,那么传给函数的参数将不能使用arguments关键字访问,而只能通过定义的命名参数访问。
虽然箭头函数中没有arguments对象,但可以在包装函数中把它提供给箭头函数。
代码语言:javascript复制function foo() {
let bar = () => {
console.log(arguments[0]); // 5
};
bar();
}
复制代码
注意:ECMAScript中的所有参数都按值传递的。不可能按引用传递参数。如果把对象作为参数传递,那么传递的值就是 这个对象的引用。
没有重载
ECMAScript函数不能像传统那样重载。一个函数可以有两个定义,只要签名不同就行。ECMAScript函数没有签名,因为参数是由包含零个或多个值的数组表示的。没有函数签名,自然也就没有重载。
定义同名函数,后定义的会覆盖先定义的。
默认参数值
在 ECMAScript5.1 及以前,实现默认参数的一种常用方式就是检测某个参数是否等于 undefined,如果是则意味着没有传这个参数,那就给它赋一个值:
代码语言:javascript复制function makeKing(name) {
name = (typeof name !== 'undefined') ? name : 'da';
return `xx ${name} xx`;
}
console.log(makeKing()); // 'xx da xx'
console.log(makeKing('ff')); // 'xx ff xx'
复制代码
ES6 写法,只要在函数定义中的参数后面用=
就可以为参数赋一个默认值
在使用默认参数时,arguments 对象的值不反映参数的默认值,只反映传给函数的参数,它始终以调用函数时传入的值为准。给参数传 undefined 相当于没有传值。
代码语言:javascript复制function make(name = 'aa') {
name = 'bb';
return `d ${arguments[0]}`;
}
console.log(make()); // 'd undefined'
console.log(make('da')); // 'd da'
复制代码
函数的默认参数只有在函数被调用时才会求值,不会在函数定义时求值。而且,计算默认值的函数只有在调用函数但未传相应参数时才会被调用。
默认参数作用域与暂时性死区
因为参数是按顺序初始化的,所以后定义默认值的参数可以引用先定义的参数。
参数也存在于自己的作用域中,它们不能引用函数体的作用域。
代码语言:javascript复制function makeKing(name = 'dada', numerals = name) {
return `King ${name} ${numerals}`;
}
console.log(makeKing()); // King dada dada
复制代码
参数初始化顺序遵循“暂时性死区”规则,即前面定义的参数不能引用后面定义的。
代码语言:javascript复制function makeKing(name = 'Henry', numerals = defaultNumeral) {
let defaultNumeral = 'VIII';
return `King ${name} ${numerals}`;
}
makeKing();
// Uncaught ReferenceError: defaultNumeral is not defined
复制代码
未完结!更多内容尽情期待下一节~