function func(x,y = function assa() {x = 2;}) {
var x = 3;
y();
console.log(x);
}
func(5)//3
function func(x,y = function assa() {x = 2}) {
x = 3;
y();
console.log(x);//
}
func(5)//2
function fun1(x,y = function assasasa() {x = 2}) {
var x = 3;
var y = function asa() {x = 4}
y();
console.log(x);
}
fun1(5)//4
这三道题其实比较有意思,这里把函数参数默认值引入进来了,还是那句话,js是词法作用域,在定义的时候就已经决定好了。
第一道题,函数内部的var x = 3是一个局部变量,而function assa其实定义在函数的外部并不在内部,所以x = 2其实修改的是外面的x为2,反正不会修改到x = 3这里来,因此打印结果还是3。结果跟下面的代码是一个意思。
function assa() {
x = 2;
}
function func(x,y = assa) {
var x = 3;
y();
console.log(x);
}
func(5)//3
第二道题,和第一道题唯一的不同就是x = 3而不是var x = 3,这里x = 3其实就是在改上面作用域的值了,func(5)传入的是5,我们会认为此时函数作用域内x就是5,但其实还有一点小的细节。
当函数参数带有默认值的时候,所有的参数都会放在“参数作用域”当中,可以理解为另一个神秘的作用域了,x其实也在里面,此时那个作用域里面有x = 5,也有函数assa,由于函数func用了 x = 3修改了x的值,所以x = 5在参数作用域内变成了3,然后assa调用的时候,又把值修改成了2,所以结果就是2了。
第三道题,因为y中的函数其实就定义在函数内部,所以他是内部的作用域,修改的就是x = 3那个值,x变成了4,所以结果就是4。第三个例子最简单,var x 和var y都和参数没关系,他们在函数内部,所以管的是自己,就没有什么难理解的内容了。
网友评论