在程序语言中,所谓闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。这些外部执行域的非持久型变量神奇地保留他们在闭包最初定义(或创建)时的值。
作用域链
var a = 1 ;
function text(){
var b = 2 ;
return a ;
}
console.log(text());
console.log(b);
可以看出b无法在外部被打印出来,而在函数外部定义的a则被打印出来
a = 1 ;
function text(){
var b = 2 ;
function text1(){
var c = 3 ;
console.log("text1函数打印的a:"+a);
console.log("text1函数打印的b:"+b);
console.log("text1函数打印的c:"+c);
return c;
}
text1();
}
text();
可以看出,text可以使用所有的变量,这就形成了一个作用域链的效果
text1可以访问自己的,父级的,全局得到,一层一层往上走。
词法作用域
function f1(){
var a = 1 ;
return f2();
}
function f2(){
return a;
}
console.log(f1());
只能访问自身的作用域和全局里面内容,这两个函数是不共享的
通过闭包突破全局作用域链
function f1(){
var a = 'qwe' ;
return function(){
return a ;
};
}
var text = f1();
console.log(text());
结果成果的访问到了a,这种方法将a的值提升到了全局区域,通过访问text就可以访问a的值
也可以在定义一个全局变量,在函数里面赋值后在外部调用
var n;
function f1(){
var a = 'qwe' ;
n = function(){
return a ;
};
}
f1();
console.log(n());
得到的结果是一样的
优点:不产生全局变量,实现属性私有化。