JS – 闭包
闭包例子
function createFunction() { val local = 100; return function() { return local; }; }
为什么这是闭包?
local 这个 局部变量 是 可达 的, 就会尽力保存局部变量, c 语言做不到这样
function f1() { var a = 20; function f2() { alert(a); } return f2; } var a = 99; var f = f1(); f(); // 20
在 c 语言中, f1 内的局部变量在 f1 函数执行完后就会被弹出栈
在 js 中, f1 执行过程, 生成了 f2, 而从作用域上, f2 能访问到 a 这个变量, 于是返回的函数形成一个 环境包, 这个环境包属于 f2, 外部不能访问所以叫闭包
闭包计数器
var cnt = (function () { var cnt = 0; return function () { return ++cnt; } })(); alert(cnt()); alert(cnt()); alert(cnt());
$ = {}; $.cnt = (function () { var cnt = 0; return function () { return ++cnt; } }()); alert($.cnt()); alert($.cnt()); alert($.cnt());
闭包的作用和缺点
- 局部变量保存在内存中, 不让垃圾回收机制将其收回
- 让外部去访问内部函数的局部变量
缺点:
闭包使用太多, 内存消耗太大
TODO 待解决
var arr = new Array(); for (var i = 0; i < 4; i++) { arr.push(function(i) {alert(i);}); } arr[0](); arr[3]();