js函数参数默认值为函数的情况

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都和参数没关系,他们在函数内部,所以管的是自己,就没有什么难理解的内容了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。