闭包
一个函数和对周围词法环境的引用捆绑在一起就是闭包。 :::info 闭包和对象在某些特性上是相同的。对象通过this实现方法和属性的绑定。 :::
例子当自由变量作为状态变量使用时,闭包函数会记住上次执行的状态变量, 使得函数不再是执行单一的功能。
var foo = function (){
var state = true;
function bar(){
if(state === true){
state = false;
return 'yes';
}else{
state = true;
return 'no';
}
}
return bar;
}
var bar = foo();
console.log(bar()); //yes
console.log(bar()); //no
例子当自由变量作为公共变量使用时,多个函数可以有一个公共变量,同时封闭该公共变量的作用域,不会暴露在全局中。
var foo = function (){
var state = true;
function bar1(){
state = !state;
return 'yes';
}
function bar2() {
state = !state;
return 'no';
}
return {
bar1,
bar2,
};
}
var bar = foo();
console.log(bar.bar1()); //yes
console.log(bar.bar2()); //no
例子自由变量也可以放在外部函数的参数变量中。
-----------------------------------------------------------------------------------------------------------------------------
/**
* 描述:根据变量对tag = H1,生成了针对H1的特殊函数,相当与做了一个缓存,下次不必在做同样的事情,直接从H1开始调用下面的函数。
* 以空间换取时间。
*/
function htmlTag(tag){
function htmlText(text){
console.log("<" + tag + ">" + text + "<" + tag + ">" );
}
return htmlText;
}
var print_H1 = htmlTag("H1");
printH1("陈前"); //<H1>陈前<H1>
var print_P = htmlTag("P");
printP("闭包"); //<P>闭包<P>