关于函数默认参数的问题
来源: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
相似问题
