学习JS闭包

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.会改变父函数内部变量的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值