1. 参数的默认值
在 ES6 中可以很方便的给函数设置默认值。
1 | function foo(x, y = 'world') { |
注意:函数内部不能对形参再次声明;函数的形参不能重名;有默认值的参数要放在最后。
2. 与结构赋值结合
我们在前面讲过结构赋值,在这里补充一点:如果使用了结构赋值,在没有给默认值的情况下就必须给实参,否则会报错。
1 | function foo(x, y = 5) { |
3. length 属性
函数的 length 属性是 没有指定默认值的参数的个数。
1 | function foo(x, y = 5) {} |
4. 参数的作用域
一旦给参数设置了默认值,那么参数就会形成一个单独的作用域。这种情况在不设置默认值的时候是不会出现的。具体看下面的几个例子:
1 | let x = 1 |
在上面的例子中,y的值输出为2。因为函数的参数会形成一个单独的作用域,在该作用域中,x被赋值为2,因此y的值也为2。我们再看下一个例子:
1 | let x = 1 |
在参数的作用域中,y被赋值时找到了x,因为此时x为undefined,因此y的值也为undefined。上述的两个例子中,参数的作用域里都有x。
1 | let x = 1 |
在这个例子中,参数的作用域里并没有x,因此y被赋值时,就会沿着作用域链向上查找。然后查找到了全局变量x,并将全局变量x的值赋值给了y。
1 | function foo(y = x) { |
我们上一个例子说了,参数的作用域内没找到x时,会沿着作用域链向外查找,而并不会向内查找。因此是查找不到变量x的,故而报错。
5. 函数的 name 属性
一般而言,在 function 关键字后面就会跟着函数名,函数的 name 属性就是指向这个函数名。但是在使用匿名函数与使用 bind() 方法时,情况会有所不同。我们通过下面的例子来更好地理解函数的 name 属性。
1 | function foo() {} |