闭包
- 当内部函数被保存到外部时,将会生成闭包
- 闭包会导致原有作用域链不释放,造成内存泄漏
闭包作用
- 实现公有变量
//eg:函数累加器
funvtion add() {
var count = 0;
function demo() {
count++;
console.log(count);
}
return demo;
}
var counter = add();
counter();
counter();
- 可以做缓存(存储结构)
//eg:eater
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('Banana');
eater1.eat();
-
可以实现封存,属性私有化
-
模块化开发,防止污染全局变量
闭包的栗子
function test() {
var arr = [];
for(var i = 0; i < 10; i++){
(function (j) {
arr[j] = function () {
console.log(j);
}
}(i))
}
return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
myArr[j]();
}
立即执行函数
-
此类函数没有声明,子啊一次执行过后即释放。适合做初始化工作
-
针对初始化功能的函数,执行完就被释放,函数的引用不被保存
-
写法:
( function () {} () ); W3C建议第一种
( function () {} ) ();
- 只有表达式才能被执行符号执行
function test() {
var a = 123;
}() //无法执行,这是函数声明,不是表达式
- 函数表达式:
var test = function () {
console.log('a');
}()
- 被执行符号执行的表达式就成了立即执行函数
- 被执行符号执行的表达式被执行后放弃函数名字
正(+)、负(-)、括号(())都可以将函数转换为函数表达式
+ function test() {
console.log('a');
}();
- function test() {
console.log('a');
}();
(function test() {
console.log('a');
})();