关于js闭包和函数默认参数的解释

关于js的闭包

一个定义使用闭包的例子

js里面

函数是一段包装好的代码

闭包就是使用了外部定义量的函数。

函数默认参数是调用时候动态计算的,如果使用了默认参数的话,如下:

let myVar = 123;
function testFunc(a = myVar) {
    console.log(a);
  }
  
  testFunc(); // 输出:123
  
//   myVar = 456;
  testFunc(); // 输出:456

定义的函数testFunc使用myVar为参数a的默认值,当无实参调用testFunc,比如testFunc();的时候
里面的a其实就是定义时对应的外部myVar

需要注意的是参数默认值是定义的时候就计算完成的,在定义testFunc()的时候就确定了a的默认参数是外部一个名为myVar的量。

其实myVar就是一个闭包了,因为捕获有外部量

关于默认参数定义时确认的理解

修改下上述例子:

let myVar = 123;
function testFunc(a = myVar) {
    console.log(a);
}
{
    let myVar=333
    testFunc()  //输出:123
}
testFunc(); // 输出:123

完成闭包testFunc的定义之后,又定义了一个局部块,局部块中定义了一个局部同名变量myVar,并且调用了testFunc,
然后在局部块后面又调用了testFunc.

两次打印结果一样,说明使用的a实际都是开始定义时外部的myVar,而不是在调用的时候再根据定义中默认参数的名字myVar去逐层作用域向上寻找。
这就是在定义使用默认参数的函数的时候默认参数在定义时计算完成的意义.

如果还不够清晰,看看下面例子:


let myVar=3
let innerDefineClosure;
function m(){
    let myVar=55
    innerDefineClosure=function(a=myVar){
        console.log(a)
    }
}
m()
innerDefineClosure()    //输出55
myVar=2
innerDefineClosure()    //输出55

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值