闭包

一个函数和对周围词法环境的引用捆绑在一起就是闭包。 :::info 闭包和对象在某些特性上是相同的。对象通过this实现方法和属性的绑定。 :::

例子当自由变量作为状态变量使用时,闭包函数会记住上次执行的状态变量, 使得函数不再是执行单一的功能。

  1. var foo = function (){
  2. var state = true;
  3. function bar(){
  4. if(state === true){
  5. state = false;
  6. return 'yes';
  7. }else{
  8. state = true;
  9. return 'no';
  10. }
  11. }
  12. return bar;
  13. }
  14. var bar = foo();
  15. console.log(bar()); //yes
  16. 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>