什么是闭包
用一句话概括:函数外部可以访问函数内部的变量
(不懂没关系,请往下面看)
闭包的原理
javascript作用域
对于函数外部的变量,函数内部可以访问
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外部读取它的内部变量了吗!
闭包的应用场景
//闭包自执行
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
作者:甘洪翔
链接:https://www.zhihu.com/questio...
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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 里的闭包是什么?应用场景有哪些?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。