- 如何更好的理解Javascript闭包
- 我从来不理解 JavaScript 闭包,直到有人这样向我解释它...
- 解密JavaScript闭包
- Underscore.js的函数部分基本都用到了闭包,可以看一看。目前也正在分析lodash的源码,见Lodash-Source-Code-Analyse
- 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见方式就是在一个函数内创建另一个函数, 创建的函数可以访问到当前函数的局部变量;这意味着,当前作用域总是能够访问外部作用域中的变量。简单来说, 闭包就是一个访问父函数局部变量的函数。
- 闭包有两个常用的用途: (1)使我们在函数外部能够访问到函数内部的变量。通过使用闭包,我们可以在外部调用闭包函数,从而在外部访问到函数 内部的变量,可以使用这种方法来创建私有变量。 (2)使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量 对象不会被回收。
//最简单的一种形式:一个父函数
function superFunc(){
// 局部变量
var _super_a = 1;
var subFunc = function(){
// _super_a++;
alert('_super_a: ' + _super_a);
}
return subFunc;
}
// superFunc() 得到的是subFunc,superFunc()()等于subFunc()
superFunc()();
首先,闭包是一个函数(上述示例代码中的subFunc),该函数必须有父函数(上述示例代码中的superFunc),然后调用了父函数的变量。
- 使用闭包可以在JavaScript中模拟块级作用域。(在ES6之前,js本身没有块级作用域的概念)
function outputNumbers(count){
(function(){
for(var i = 0; i < count; i++){
alert(i);
}
})();
alert(i); //导致一个错误!就是永远打印出的都是count的值
}
- 闭包可以用于在对象中创建私有变量。
function MyObject(){
// 私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
// 特权方法,调用私有方法、函数
this.publicMethod = function(){
privateVariable++;
return privateFunction();
}
}