1、javaScript变量有2种。全局变量,私有变量,而私有变量可用到闭包。
区分说明;
var a=1;
d=1;
function init(){
b=2;
var c=3;
return a*b*c;
}
函数init中,函数外声明的a、没有使用关键字var声明的变量b、d都是全局变量,属于window对象,作用于该html页面所有js文件。
2.变量作用域
javaScript变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
var a=1;
function f1(){
alert(a);
}
f1(); //1
另一方面,在函数外部自然无法读取函数内的局部变量。
function f1(){
var a=1;
}
alert(a); //Uncaught ReferenceError: a is not d否则,实际上声明了一个全局变量!
function f1(){
a=1;
}
f1();
alert(a); // 1
3.理解闭包
以我个人通俗的理解有2个点。1、闭包的形式就是一个函数包含另一个函数;2、闭包的作用就是使一个函数能够读取其他函数内部变量;3、闭包的本质就是将函数内部和函数外部连接起来的一座桥梁。闭包就是被包裹函数可以访问外层包裹函数作用域里的变量,即使上一层函数已经执行完(关闭)。
缺点:1、大量使用闭包会增加内存消耗,使得函数内的变量一直占用内存,影像性能。优点:1、加强变量私有性、安全性、避免全局污染;
实例说明
1.常规写法
function outFun(){
var a=0;
a+=1;
return a
}
//连续调用3次,私有变量,函数执行后被回收
outFun();//1
outFun();//1
outFun();//1
1.闭包写法
var outFun=(function(){
var a =0;
return function(){
return a+=1;
}
})();
双括号匿名函数初始化值执行一次,初始化a=0;将里面的匿名函数表达式返回给outFun变量,而变量a每次执行后一直保存在内存中。
闭包是可访问上一层函数作用域里变量的函数,即便上一层函数已经关闭 |