函数length属性
指定了默认值之后,函数的length属性只返回没有指定默认值的参数个数,也就是 指定默认值之后,length属性失真了。
lenght属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,rest参数也是不计入这个length属性的。如果设置默认值的参数不是尾参数,那么length属性也不再计入后面的参数了
1 |
|
作用域
一旦设置了参数的默认值,函数将进行声明初始化,参数将会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。
1 |
|
上面代码中,参数
y的默认值等于变量x。调用函数f时,参数形成了一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,因此 输出 2。
1 |
|
上面代码中,函数
f调用时,参数y=x形成一个单独的作用域。这个作用域里面,变量x本身是没有定义的,所以指向了外面的全局变量x。函数调用的时候,函数体内部的局部变量x是影响不到默认值变量x的。
1 |
|
- 上面代码中,例子1的函数
foo的参数形成一个单独作用域。这个作用域里面,首先声明了变量x,然后声明了变量y,y的默认值是一个匿名函数。这个匿名函数内部的变量x,指向同一个作用域的第一个参数x。- 函数
foo内部又声明了一个内部变量x,该变量与第一个参数x由于不是同一个作用域,所以不是同一个变量,因此执行y后,内部变量x和外部全局变量x的值都没变。- 如果将
var x = 3的var去除,函数foo的内部变量x就指向第一个参数x,与匿名函数内部的x是一致的,所以最后输出的就是2,而外层的全局变量x依然不受影响。