闭包是函数的特性
每个函数都可以记住并访问所在的作用域,当函数在当前作用域之外调用时,就会产生闭包。
可以简单的认为,一个函数的作用域链就是一个闭包。
var foo = (function bar(i) {
function inner() {
console.log(i);
}
return inner;
})(10);
foo();
由于inner函数记住了bar函数作用域及自己内部的作用域。所以执行inner(也就是foo),就会产生闭包。
利用闭包劫持变量
for(var i = 0; i < 5; i++) {
(function(i){
setTimeout(function timer() {
console.log(i);
}, i * 500);
}(i));
}
执行上面代码,每次循环timer函数都会记住不同的环境(IIFE函数作用域),也就产生了不同的闭包,每个闭包中都劫持了一份i值得副本,分别为0~4。