函数的扩展

函数参数的默认值

基本用法

  function log(x, y) {
    y = y || 'World'
    console.log(x, y)
  }

  log('Hello') // Hello World
  log('Hello', 'China') // Hello China
  log('Hello', '') // Hello World

与解构赋值默认值结合使用

  function fetch(url, { body = '', method = 'GET', headers = {} }) {
    console.log(method)
  }

  fetch('http://example.com', {}) // 'GET'

  fetch('http://example.com') // Uncaught TypeError: Cannot read property 'body' of undefined

解构赋值默认值的例子

  function fetch(url, { body = '', method = 'GET', headers = {} } = {}) {
    console.log(method)
  }

  fetch('http://example.com') // 'GET'

函数的length属性:指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真

  (function (a) {}).length  // 1
  (function (a = 5) {}).length  // 0
  (function (a, b, c = 5) {}).length  // 2

某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,rest参数也不会计入length属性。

  (function (...args) {}).length  // 0

如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。

  (function (a = 0, b, c) {}).length  // 0
  (function (a, b = 1, c) {}).length  // 1

rest参数

rest对象是一个真正的数组,数组持有的方法都可以使用。

  function push(array, ...items) {
    items.forEach(function(item) {
      array.push(item);
      console.log(item)
    })
  }

  var a = []
  push(a, 1, 2, 3)

严格模式

从ES5开始,函数内部可以设定为严格模式。ES2016做了一点修改,规定只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显示设定为严格模式,否则会报错

  function doSomething(a, b) {
    'use strict';
    // code
  }

name属性

函数name属性,返回该函数的函数名

  function foo() {}
  foo.name

Function构造函数返回的函数实例,name属性的值为anonymous

  (new Function).name  // 'anonymous'

bind返回的函数,name属性值会加上bound前缀。

  function foo() {}
  foo.bind({}).name  // 'bound foo'

  (function() {}).bind({}).name  // 'bound'

箭头函数

注:

  • 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
  • 不可以当做构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
  • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。
  • 不可以使用yield命令,因此箭头函数不能用作Generator函数。

尾调用优化

什么是尾调用?

尾调用就是指某个函数的最后一步是调用另一个函数。

尾调用优化

  function factorial(n, total) {
    if (n === 1) return total
    return factorial(n - 1, n * total)
  }
  function Fibonacci(n, ac1 = 1, ac2 = 1) {
    if (n <= 1) return ac2

    return Fibonacci(n - 1, ac2, ac1 + ac2)
  }

函数参数的尾逗号

Function.prototype.toString()

catch命令的参数省略

  try {
    // ...
  } catch {
    // ...
  }
posted @ 2020-04-26 20:35  lynnDu  阅读(130)  评论(0编辑  收藏  举报