请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于函数默认参数的问题

老师你好。
在刷面试题的时候,遇到一个函数默认参数的问题,没想明白。所以想过来问一下。
因为不是课程里包含的内容,所以不太好意思…但还是希望老师解答一下,感谢。。
题目如下:想问一下产生这种结果的原因。

		// 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回答

谢成 2020-08-14 09:17:39

我觉得这个题主要想考察的知识点是:函数参数设置了默认值,函数的参数就会形成一个单独的作用域。如果不设置默认值,函数参数就不会形成一个单独的作用域。


这两个例子咱们分别来看:

第一个例子:

// 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

1、这个例子中,函数默认参数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));  // 21

1、这个例子中,函数默认参数没有默认值,按照上面的说法参数就没有形成一个单独在作用域

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

9 回复 有任何疑惑可以回复我~
  • 提问者 夜魇丶 #1
    懂了,感谢感谢!回答的好详细!
    回复 有任何疑惑可以回复我~ 2020-08-14 23:01:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信