一、实现公有变量
例
函数累加器
function add(){
var count = 0;
function demo(){
count ++;
console.log(count);
}
return demo;
}
var counter = add();
counter() // 1
counter() // 2
counter() // 3
counter() // 4
counter() // 5
每回调用
counter
就会在原有基础上加一次。
二、可以做缓存(存储结构)
eg:eater
。
缓存是外部不可见的,但是确实有存储结构
例:
function test(){
var num = 100;
function a(){
num ++;
console.log(num);
}
function b(){
num --;
console.log(num);
}
return [a,b];
}
var myArr = test();
myArr[0](); // 101
myArr[1](); // 100
答案
101
和 100,
思考
过程:说明两个用的是一个
AO
test doing test[[scope]] 0
:
testAO
1:GO
a defined a.[[scope]] 0 : testAO
1 : GO
b defined b.[[scope]] 0 : testAO
1 : GO
return[a, b]
将
a
和
b
同时被定义的状态被保存出来了
当执行
myArr[0]();
时
a doing a.[[scope]] 0 : aAO
1 : testAO
2 : GO
当执行
myArr[1]();
时
b doing b.[[scope]] 0 : bAO
1 :
a
运行后的
testAO
2 : GO
a
运行后的
testAO
,
与
a doing
里面的
testAO
一模一样
a
和
b
连线的都是
test
环境,对应的一个闭包
function a
和
function b
是并列的,不过因为
function a
在前,所以先执行
num ++
,在
执行
num --
myArr[0]
是数组第一位的意思,即
a
,
myArr[0]();
就是执行函数
a
的意思;
myArr[1]
是数组第二位的意思,即
b
,
myArr[1]();
就是执行函数
b
的意思;
例
缓存的应用,对象里面可以用属性和方法
function eater(){
var food = "";
var obj = {
eat: function(){
console.log('i am eating' + food);
food = '';
},
push: function (myfood){
food = myfood
}
}
return obj;
}
var eater1 = eater();
eater1.push('汉堡包');
eater1.eat();
答案 :i am eating 汉堡包,eat 和 push 操作的是同一个 food 在 function eater(){里面的 food}就相当于一个隐式存储的机构 obj 对象里面是可以有 function 方法的,也可以有属性,方法就是函数的表现形式。
三、可以实现封装,属性私有化。
四、模块化开发,防止污染全局变量
上一篇:
javascript 闭包https://blog.csdn.net/qq_38909255/article/details/122316795
下一篇:
JavaScript 立即执行函数 https://blog.csdn.net/qq_38909255/article/details/122409370