var db = (function() { // 创建一个隐藏的object, 这个object持有一些数据 // 从外部是不能访问这个object的 var data = {}; // 创建一个函数, 这个函数提供一些访问data的数据的方法 return function(key, val) { if (val === undefined) { return data[key] } // get else { return data[key] = val } // set } // 我们可以调用这个匿名方法 // 返回这个内部函数,它是一个闭包 })(); db('x'); // 返回 undefined db('x', 1); // 设置data['x']为1 db('x'); // 返回 1 // 我们不可能访问data这个object本身 // 但是我们可以设置它的成员
1.当function里嵌套function时,内部的function可以访问外部function里的变量。
2. 外部变量(环境变量?),
包括:
2.1 全局变量,包括DOM。
2.2 外部函数的变量或函数。
如果一个函数访问了它的外部变量,那么它就是一个闭包。
从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据。
没return的闭包:
function closureExample() { var temp = 10; setTimeout(function () { console.log(++temp); }, 1000); } closureExample()
闭包实例:
function demo() { var temp = 5; function add() { console.log(temp++); } return add; } var demeInstance = demo(); //console中调demeInstance,temp就一直加