JavaScript闭包

JavaScript 闭包

私有变量可以用到闭包。

函数可以访问函数内部定义的变量,函数也可以访问函数外部定义的变量。

 

变量生命周期:

全局变量的作用域是全局性的。

而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。

如果变量是全局变量,那么页面上的任何脚本都能改变变量,即便没有调用函数。如果在函数内声明变量,如果没有调用函数将无法修改变量的值:JavaScript 内嵌函数可以解决该问题。

 

计数器困境例子:

var   a = 0;

function x(){

  a+ = 1;

}

x();   //计数器为1

x();   //计数器为2

x();   //计数器为3

但此时a为全局变量,任何脚本即使不调用x函数 也可以改变计数器的值

但如果在函数内声明变量a。如果没有调用函数就无法修改a的值!!!

 

 

function x(){

  var   a = 0;

  a+ = 1;

}

x();   //计数器为1

x();   //计数器为1

x();   //计数器为1

每次调用x函数都会输出1,因为变量在函数里面,执行一次都会重新声明变量!!!

 

JavaScript 内嵌函数

所有函数都能访问全局变量。在 JavaScript 中,所有函数都能访问它们上一层的作用域。

内嵌函数 add() 可以访问父函数的 a变量:

function x() {
    var a= 0;
    function add() {a+= 1;}
    add();    
    return a; 
}
此时返回值为1,

如果能在外部访问 add() 函数,这样就能解决计数器的困境。我们同样需要确保 counter = 0 只执行一次。

 
 

JavaScript 闭包

函数自我调用

var x = (function () {
    var a = 0;
    return function () {return a += 1;}
})();

x();      // 计数器为1
x();        // 计数器为 2
x();        // 计数器为 3


 
计数器受匿名函数的作用域保护,只能通过 x方法修改。x指定了函数自我调用的返回值
 
 
 
 
 
 
 
posted @ 2019-02-28 17:40  程序图  阅读(115)  评论(0编辑  收藏  举报