关于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