关于函数默认参数的问题
来源:2-11 函数的参数
夜魇丶
2020-08-13
老师你好。
在刷面试题的时候,遇到一个函数默认参数的问题,没想明白。所以想过来问一下。
因为不是课程里包含的内容,所以不太好意思…但还是希望老师解答一下,感谢。。
题目如下:想问一下产生这种结果的原因。
// c有默认值的情况
function side1(arr) {
arr[0] = arr[2];
}
function a(a, b, c = 3) {
c = 10;
side1(arguments);
return a + b + c;
}
console.log(a(1, 1, 1)); // 12
// c没有默认值的情况
function side2(arr) {
arr[0] = arr[2];
}
function b(a, b, c) {
c = 10;
side2(arguments);
return a + b + c;
}
console.log(b(1, 1, 1)); // 21
网上的解答是:因为 a 函数加了默认值,就按 ES 的方式解析,ES6 是有块级作用域的,所以 c 的值是不会改变的。
但还是没明白…
辛苦了。
1回答
-
我觉得这个题主要想考察的知识点是:函数参数设置了默认值,函数的参数就会形成一个单独的作用域。如果不设置默认值,函数参数就不会形成一个单独的作用域。
这两个例子咱们分别来看:
第一个例子:
// c有默认值的情况
function side1(arr) {
arr[0] = arr[2];
}
function a(a, b, c = 3) {
c = 10;
side1(arguments);
return a + b + c;
}
console.log(a(1, 1, 1)); // 121、这个例子中,函数默认参数c=3,是有默认值,按照上面的说法就会形成一个单独的作用域。
2、当a(1,1,1)时,c的默认值3会被传递过来的1覆盖掉,所以这时参数c=1。
3、c=10这句的c并不是函数参数的c,因为上面说过函数参数的c是在一个单独的作用域中。
4、side1(arguments)这句,arguments取到的是函数参数内的值,所以side1的参数arr=[1,1,1]
5、return a+b+c这句,a=1 b=1比较明显。c在取值的时候按照作用域链会先在当前取值的作用域内去找,会找到当前作用域中c=10的这个c
6、所以a+b+c = 1+1+10 = 12
第二个例子:
// c没有默认值的情况
function side2(arr) {
arr[0] = arr[2];
}
function b(a, b, c) {
c = 10;
side2(arguments);
return a + b + c;
}
console.log(b(1, 1, 1)); // 211、这个例子中,函数默认参数没有默认值,按照上面的说法参数就没有形成一个单独在作用域
2、当b(1,1,1)时,函数的参数的值应该是:a=1 b=1 c=1
3、c=10这句,因为函数参数没有形成单独的作用域,也就是c=10的c 和 参数中的c是同一个c
4、side2(arguments)这句,arguments取到的值就是a=1 b=1 c=10,因为参数的c的值被前面c=10这句给改变了,所以side2的参数arr=[1,1,10]。执行完arr[0] = arr[2]之后,arr=[10,1,10]
5、return a+b+c这句,a=10 b=1 c=10,a之所以等于10,是因为值在side2函数中被改变了
6、所以a+b+c = 10+1+10 = 21
912020-08-14
相似问题