美文网首页
js函数参数默认值为函数的情况

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

作者: zzglovecoding | 来源:发表于2020-07-27 02:28 被阅读0次
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都和参数没关系,他们在函数内部,所以管的是自己,就没有什么难理解的内容了。

相关文章

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

    这三道题其实比较有意思,这里把函数参数默认值引入进来了,还是那句话,js是词法作用域,在定义的时候就已经决定好了。...

  • ES6入门之函数的扩展

    函数的扩展分为以下3个部分: 1 为函数参数指定默认值2 函数的 rest 参数3 箭头函数 为函数参数指定默认值...

  • 第六章 函数

    1.访问函数的参数:使用函数原型中的参数名2.为函数的参数设定默认值:在函数原型内部为参数指定默认值3.传递引用:...

  • ES6 函数的扩展

    函数参数的默认值 ES6允许为函数的参数设置默认值,即直接写在参数定义的后面 函数参数默认值与解构赋值默认值结合使...

  • ES6标准入门 摘要 (函数的扩展)

    函数的扩展 函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。 参数默认值不是传值的...

  • 1.0 C++远征:函数参数默认值、函数重载、内联函数

    C++远征 [TOC] 一、函数参数默认值 1.函数参数默认值的声明 2.函数参数默认值的定义 3.函数参数默认值...

  • ECMAScript6学习(二)

    函数的扩展 函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。 与解构赋值默认值结合...

  • C++之函数参数的扩展

    函数参数的默认值 C++中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的...

  • 8.函数的扩展

    1.函数参数的默认值 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 ES6 允许为函数的参数...

  • ES6函数的扩展

    函数参数的默认值 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数log的参数...

网友评论

      本文标题:js函数参数默认值为函数的情况

      本文链接:https://www.haomeiwen.com/subject/ltaolktx.html