1.js中变量的作用域有两种:全局变量和局部变量;
2.全局变量在js的任何地方都可以访问
var n=100;
function f(){
document.write(n);
}
f(); //100
3.局部变量在函数外部无法进行访问
function f(){
var n=100;
}
document.write(f()); //报错
在函数内部声明变量要用var ,否则为全局变量
4.怎样能够在外部读取到函数内部的局部变量??
利用闭包:1.什么是闭包?有权访问另一个函数作用域中的变量(不是全局函数,所以不会被污染,但又能始终保存在内存中,可重用)
5.简单闭包例子
function factory(){
var n=1;
return function(){
return n++;
}
}
var icbc=factory();
console.log(icbc());
console.log(icbc());
//调用f2,也可写为factory()()
- 解析代码:在ESC(环境执行栈)中先有一个全局EC引用一个window对象存有全局变量icbc和factory()
- 执行函数factory()时,向ESC中压入函数对象,函数对象的活动对象中存有变量n和函数
从图片可以看出icbc引用函数中的内部函数,内部函数的作用域链指向factory的活动对象,活动对象中的变量n被全局变量icbc调用,形成三角关系
6.闭包的缺点
1.闭包会将函数中的变量保存在内存中,内存消耗大,导致内存泄漏
解决:退出函数后释放函数(null)
2.会改变父函数内部变量的值