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;
}
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
var a = 0;
return function () {return a += 1;}
})();
x(); // 计数器为1
x(); // 计数器为 2
x(); // 计数器为 3
计数器受匿名函数的作用域保护,只能通过 x方法修改。x指定了函数自我调用的返回值