用一句话归纳:函数外部能够访问函数内部的变量
(不懂不要紧,请往下面看)javascript
对于函数外部的变量,函数内部能够访问html
var n=1000; function fn(){ console.log(n); } fn();//输出1000
function fn(){ var n=1000; } console.log(n)//n is not defined
function fn(){ var n=1000; function fn1(){ return n; } return fn1; } var f=fn(); console.log(f());//1000
在上面的代码中,函数fn1就被包括在函数fn内部,这时fn内部的全部局部变量,对f1都是可见的。可是反过来就不行,f1内部的局部变量,对fn就是不可见的。这就是Javascript语言特有的"链式做用域"结构(chain scope),子对象会一级一级地向上寻找全部父对象的变量。因此,父对象的全部变量,对子对象都是可见的,反之则不成立。
既然f1能够读取fn中的局部变量,那么只要把f1做为返回值,咱们不就能够在fn外部读取它的内部变量了吗!java
//闭包自执行 var foo=function fn(){ var n=1000; return { get_n:function(){ return n; }, set_n:function(new_n){ n=new_n; } } }(); //foo.n 访问不了,undefined foo.set_n(999);//经过接口能够设置内部变量n console.log(foo.get_n());//经过接口能够读取内部变量n
var Foo = function(){ var name = 'fooname'; var age = 12; this.getName = function(){ return name; }; this.getAge = function(){ return age; }; }; var foo = new Foo(); foo.name; // => undefined foo.age; // => undefined foo.getName(); // => 'fooname' foo.getAge(); // => 12
阮一峰老师的:学习Javascript闭包(Closure)
知乎上:JavaScript 里的闭包是什么?应用场景有哪些?闭包