啥是闭包
内部函数被保存到了外部,一定生成闭包。
【例】如下,b函数被保存到了外部,输出结果为101、102
function a () {
var num = 100;
function b () {
num ++;
document.write(num);
}
return b;
}
var glob = a();
glob();
glob();
闭包缺点
闭包会导致原有作用域链不能释放,造成内存泄漏。
闭包作用
实现公有变量
【例】函数累加器
function add () {
var count = 0;
function sum () {
count ++;
document.write(count+"\n");
}
return sum;
}
var counter = add();
counter();
counter();
可以做缓存
【例】简易存储结构
function eater () {
var food = "";
var obj = {
eat : function () {
document.write("I am eating "+ food);
food = "";
},
push : function (myfood) {
food = myfood;
}
}
return obj;
}
var eater1 = eater();
eater1.push("honey");
eater1.eat();
可以实现封装,属性私有化
模块化开发,防止污染全局变量
立即执行函数
针对初始化功能的函数(只执行一次,执行后再也不需要,不希望它继续占内存)
两种形式
(function () {} () );
W3C建议(function () {} ) ();
为什么这样做就相当于立即执行函数?
答:因为练习正常执行函数都是函数的引用或者说名称加上执行符号()
,例如test();
这里所说的函数的引用或者说名称实际上代表了函数的表达式,在函数表达式后面加上执行符号就代表执行函数,此处(function () {} () ); (function () {} ) ();
【例】1
//可以执行,因为var 变量名 = function(){}相当于函数表达式
//执行之后再访问test1为undefined,
//因为function作为立即执行函数执行后放弃了表达式的名称test1
var test1 = function () {
document.write("doing");
}();
【例】2
//会报错,不能执行,因为cichufunction是函数声明,而不是表达式
function test2 () {
document.write("doing");
}();
【例】3
//不能执行,但是不会报错,对比test2由于立即执行符号()传了参数
//所以系统会把函数后面的立即执行符号看作单独的一行表达式
// function test3 (a, b, c, d) {
// document.write(a + b + c +d);}
//(1,2,3,4);此处与直接写1,2,3,4其实一样
function test3 (a, b, c, d) {
document.write(a + b + c +d +"doing");
}(1,2,3,4);
【例】4
//能执行,因为+把函数声明转换为表达式,同时! - || &&都可以
+function test4 () {
document.write("doing");
}();
来源:https://blog.csdn.net/qq_42842786/article/details/100098928