讲讲javascript中的闭包
很多人以为 javascript 中的闭包就是 一个IIEF 或者一个 外部变量引用 某一个函数的内部函数 这2种形式
其实这是不对的。。闭包指的不是某一种形式 而指的是某种作用域的引用
// 大部分人所认为的js的闭包 其实这只是个立刻执行的匿名函数表达式 IIEF
(function(){
console.log('hello');
})();
// 或者这种形式
function foo(){
var a = 2;
function bar(){
console.log(a);
}
return bar;
}
var baz;
baz = foo();
baz();
而闭包指的是某一种对一定范围的内的词法作用域的引用
例如:
function foo(){
var a = 2;
function bar(){
console.log(a);
}
return bar;
}
var baz;
baz = foo(); // baz保持着bar对foo的词法作用域的引用
baz();
下面这种也叫闭包
function foo(){
var a = 2;
function bar(){
console.log(a);
}
baz = bar; // 这里bar 赋值给了外部的baz
}
var baz;
foo(); // 执行之后 baz 拥有了和bar同样的对foo的词法作用域的引用
baz();
或者这种
function baz(func){
func(); // 这里执行bar
}
function foo(){
var a = 2;
function bar(){
console.log(a);
}
baz(bar); // 这里bar 作为参数赋值给力bar
}
foo(); // 执行之后 baz 拥有了和bar同样的对foo的词法作用域的引用
baz();
通过上面3个例子大家就应该明白了 javascript里闭包的概念了
闭包指的不是某一种形式 而指的是某种作用域的引用
同时因为一直保持着对某一个词法作用域的引用 所以被引用的函数是一直无法被GC回收的 所以要慎用闭包