参数的默认值

默认参数的设置

  1. function foo(x, y = 'world') {
  2. console.log(x, y)
  3. }
  4. foo('hello,') // hello, world

函数的参数我们可以在定义方法的时候就进行赋值,如果我们后期不传入值,则传入默认值

需要注意的地方:

  1. 参数中定义的默认值,我们无法在方法体内进行二次定义赋值,比如使用 let 或者 const
function foo(x, y = 'world') {
  let y = 'es6'
}

foo('hello,')

image.png

  1. 默认参数的位置必须是末尾 ```javascript function foo(x, y = ‘world’, z) { console.log(x, y, z) }

foo(‘hello,’, ‘es6’)

![image.png](https://cdn.nlark.com/yuque/0/2020/png/656731/1592630999209-87fabc0f-e973-4b5e-b23f-b2bbe5e61467.png#align=left&display=inline&height=117&margin=%5Bobject%20Object%5D&name=image.png&originHeight=234&originWidth=462&size=15345&status=done&style=none&width=231)<br />从这里可以看出, z 参数没有赋值成功
<a name="ht6T0"></a>
## 与解构赋值结合

1.传入一个空对象时,浏览器并不会报错,只会提示**undefined**
```javascript
function foo({x, y='解构赋值'}) {
  console.log(x, y)
}

foo({});

image.png

  1. 当我们不传参数时 ```javascript function foo({x, y=’解构赋值’}) { console.log(x, y) }

foo();

![image.png](https://cdn.nlark.com/yuque/0/2020/png/656731/1592631474030-51c4e42e-852c-4faa-87aa-a1db4c8b2a12.png#align=left&display=inline&height=119&margin=%5Bobject%20Object%5D&name=image.png&originHeight=238&originWidth=1304&size=28073&status=done&style=none&width=652)

3. 解构赋值正确的传值方式
```javascript
function foo({x, y='解构赋值'}) {
  console.log(x, y)
}

foo({
  x:'学习',
  y:'es6'
});
// 学习 es6
  1. 解构赋值与默认参数的结合使用
    function ajax(url, {
    body = '',
    method = 'GET',
    headers = {}
    }={}) {
    console.log('method: ', method)
    }
    ajax('http://www.baidu.com') // method:  GET
    
    这里对最后一个参数,即对象型的参数进行了配置,首先我们给了他一个默认的 {} 空对象,这样可以避免我们使用方法的时候需要传入一个空对象,其次在参数对象的内部定义了请求方法的默认值为 GET
ajax('http://www.baidu.com', {
  method: 'POST'
})
// method:  POST

这里我们采用解构赋值的方式,修改了 method 的默认值

参数的length属性

function foo(x, y, z = 3) {
  console.log(x,y,z)
}
console.log(foo.length) // 2

这里参数的 length 表示,没有默认值的参数的个数

参数的作用域

let x = 1
function foo(x, y = x) {
  console.log('y: ', y)
}
foo(2) // y:  2

这里的参数中的 x 没有受到,全局变量 x 的影响,x 由调用方法时传入的实参决定

变形

let x = 1
function foo(y = x) {
  let x = 2
  console.log('y: ', y)
}
foo()
// y:  1

这里 方法中的参数y 调用 x时,发现既没有通过方法的实参传入,形参中也没有定义x,所以需要顺着作用域链往上找变量x, 沿着作用域链查值的时候只会向上一级作用域寻找,不会向下寻找, 所以内部定义的 x ,不会影响到 方法的形参 y的赋值

当我们将外部的 全局变量 x 删除后,执行该方法则会报错

函数的name属性

function foo() {
}
console.log(foo.name) // foo

console.log(new Function().name) // anonymous

匿名函数打印出的 name 值 anonymous 表示 匿名
**

bind() 方法

方法的 bind() 可以改变使用bind方法的 this 的指向

function foo(x, y) {
  console.log(this, x, y)
}

foo.bind({name: 'qianlong'})(11, 22);
// {name: "qianlong"} 11 22

当我们获取 使用了 bind() 的 function 的 name属性时,会有一些差别

function foo(x, y) {
  console.log(this, x, y)
}
let name = foo.bind({}).name
console.log('foo.bind() 的 name: ', name)
// foo.bind() 的 name:  bound foo

所有使用了 bind() 的 founction 获取name的时候 , 都会 多一个 bound