参数的默认值
默认参数的设置
function foo(x, y = 'world') {
console.log(x, y)
}
foo('hello,') // hello, world
函数的参数我们可以在定义方法的时候就进行赋值,如果我们后期不传入值,则传入默认值
需要注意的地方:
- 参数中定义的默认值,我们无法在方法体内进行二次定义赋值,比如使用 let 或者 const
function foo(x, y = 'world') {
let y = 'es6'
}
foo('hello,')
- 默认参数的位置必须是末尾 ```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({});
- 当我们不传参数时 ```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
- 解构赋值与默认参数的结合使用
这里对最后一个参数,即对象型的参数进行了配置,首先我们给了他一个默认的 {} 空对象,这样可以避免我们使用方法的时候需要传入一个空对象,其次在参数对象的内部定义了请求方法的默认值为 GETfunction ajax(url, { body = '', method = 'GET', headers = {} }={}) { console.log('method: ', method) } ajax('http://www.baidu.com') // method: 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