JavaScript学习笔记(二十一)函数(一)
函数名
- 函数名是指向函数的指针,它们跟其他包含对象指针的变量具有相同的行为。
- 一个函数可以有多个名称。
- ES6所有函数对象都会暴露一个只读的name属性。
- 包含关于函数的信息;
- 多数情况下,这个属性中保存的就是一个函数标识符,或者说是一个字符串化的变量名;
- 函数没有名称会如实显示成空字符串;
- 使用Function构造函数创建的,则会标识成“anonymous”。
1 | function foo() {} |
- 如果函数是一个 获取函数、设置函数,或者使用bind()实例化,那么标识符前面会加上一个前缀。
1 | function foo() {} |
函数参数
ECMAScript函数的参数在内部表现为一个数组。
函数被调用时总会接收一个数组,但函数并不关心这个数组中包含什么。
不存在验证命名参数的机制。
arguments对象是一个类数组对象;
- 可以使用中括号语法访问其中的元素。
通过arguments.length可以确定参数个数。
1 | function howManyArgs() { |
- arguments对象可以跟命名参数一起使用。
1 | function doAdd(num1, num2) { |
箭头函数中的参数
- 箭头函数的参数不能使用arguments关键字访问,只能通过定义的命名参数访问。
1 | function foo() { |
- 虽然箭头函数中没有arguments对象,但可以在包装函数中把它提供给箭头函数。
1 | function foo() { |
默认参数值
- ES6中只要在函数定义中的参数后面用就可以为参数赋一个默认值。
1 | function makeKing(name = 'Henry') { |
- 给参数传undefined相当于没有传值。
1 | function makeKing(name = 'Henry', numerals = 'VIII') { |
- 在使用默认参数时,arguments 对象的值不反映参数的默认值,只反映传给函数的参数。
1 | function makeKing(name = 'Henry') { |
默认参数作用域与暂时性死区
- 因为在求值默认参数时可以定义对象,也可以动态调用函数,所以函数参数肯定是在某个作用域中求值的。
- 给多个参数定义默认值实际上跟使用let关键字顺序声明变量一样。
- 参数初始化顺序遵循“暂时性死区”规则,即前面定义的参数不能引用后面定义的。
1 | // 调用时不传第一个参数会报错 |
参数扩展与收集
扩展参数
- **…**等价于apply()方法
1 | function getProduct(a, b, c = 1) { |
收集参数
- 使用扩展操作符把不同长度的独立参数组合为一个数组。
1 | function getSum(...values) { |
- 收集参数的前面如果还有命名参数,则只会收集其余的参数;如果没有则会得到空数组。
- 收集参数的结果可变,只能把它作为最后一个参数。
1 | // 不可以 |
- 使用收集参数并不影响arguments对象。
1 | function getSum(...values) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 姚永坤的小窝!
评论