function test(param){
return function(){
console.log(param)
}
}
setInterval(test(1), 1000);//让原本不能传参的函数成为可以传参
私有变量
let counter = (function () {
let life = 0; //私有变量
function change(val) {
life += val;
}
return {
increment: function () {
change(1);
},
decrement: function () {
change(-1);
},
value: function () {
return life;
}
};
})();
console.log(counter.value())
counter.increment()//对变量的操作只能通过闭包
console.log(counter.value())
counter = null//闭包生命结束
console.log(counter.value())
let num = 20
function test(){
let num = 10
return function(){
return ++num
}
}
let A = test()
console.log(A())//11
console.log(A())//12 闭包访问的一直是局部变量
let B = test()
console.log(B())//11 闭包有各自的变量,私有变量,各不冲突
变量提升
for (var i = 0; i < 3; i++) {
console.log(i)
}
console.log(i)//3 变量提升
function test() {
for (let i = 0; i < 3; i++) {
console.log(i)
}
console.log(i)//i is not defined 用let定义的变量不被提升
}
test()
function test() {
for (var i = 0; i < 3; i++) {
console.log(i)
}
console.log(i)
}
test()
function test() {
for (var i = 0; i < 3; i++) {
console.log(i)
}
console.log(i)
}
test()
console.log(i)//i is not defined 变量只是被提升到上一层作用域