闭包
闭包(closure):
它是一个外来词,没有对应的中文含义.你可以认为这个词是创造出来的.
所以关于它的绝大部分解释,都比较生硬难懂.
function aa() {
return function () {
console.log('这个返回的匿名函数,就是闭包');
}
}
aa()();//这个返回的匿名函数,就是闭包
本例中,右侧这个括号,运行的就是return回来的那个匿名函数.
简单的讲闭包就是,”函数套函数”.父函数里面的子函数,就是闭包.”
闭包,是一个作用域.
//==============================================================
function bb() {
console.log('这个bb函数,它就是一个闭包');
}
bb();//这个bb函数,它就是一个闭包
闭包的特性:
- 函数内部可以读取全局变量;
- 函数外部不能读取函数内部的变量;
这其实就是变量作用域.
//==============================================================
函数内部可以读取全局变量;
var a1 = 999;
function aa() {
console.log(a1);
}
aa();//999
//==============================================================
函数外部不能读取函数内部定义的变量
function aa() {
var a33 = 999;
}
console.log(a33);//(报错)a33 is not defined
aa();
//==============================================================
父函数aa不能读取子函数bb的变量
function aa() {
var a1 = 999;
console.log(b1);
function bb() {
var b1 = 888;
console.log('这个返回的匿名函数,就是闭包.')
}
}
aa();//(报错)b1 is not defined
//==============================================================
父函数读取子函数里面的变量,要使用return
function aa() {
var aa1 = 999;//私有变量
function bb() {
console.log(aa1);
}
return bb;
}
var xx = aa();
xx();
//==============================================================
闭包的用途之一,用来定义”私有方法”和”私有变量”.
这种私有的方法和变量,在外部无法访问.
//==============================================================
下面是一个对象,它同时也是一个函数,当添加了prototype的时候,他也是构造器,它有一个私有方法get,用来访问它自己内部的变量XX
function obj() {
var xx = 1;
function get() {
console.log(xx);//1
}
this.get = get;
}
obj.prototype = {
a: function () {
console.log('asaa');//asaa
}
}
var xx = new obj();
xx.get();
xx.a();
简单的讲,上面这些就是闭包的内容