前端那些事系列之基础篇闭包(十)

闭包是一种特殊的函数,它可以访问并操作其外部作用域的变量,即使在其外部作用域已被销毁后。在JavaScript中,由于函数内部可以引用外部的自由变量,所有函数都具备闭包特性。文章通过一个例子展示了当内部函数f引用了checkscope函数的变量scope时,由于作用域链的关系,JavaScript会保持checkscope上下文的变量对象在内存中,从而实现闭包的概念。
摘要由CSDN通过智能技术生成

定义

闭包是指那些能够访问⾃由变量的函数
⾃由变量是指在函数中使⽤的,但既不是函数参数也不是函数的局部变量的变量。
所以从技术角度来说,所有的js函数都是闭包。
ECMAScript中,闭包指的是:

  1. 从理论⻆度:所有的函数。因为它们都在创建的时候就将上层上下⽂的数据保存起来了。哪怕是简
    单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问⾃由变量,这个时候使⽤最外
    层的作⽤域;
  2. 从实践⻆度:以下函数才算是闭包:
    a. 即使创建它的上下⽂已经销毁,它仍然存在(⽐如,内部函数从⽗函数中返回);
    b. 在代码中引⽤了⾃由变量
实践
var scope = "global scope";
function checkscope(){
	var scope = "local scope";
	function f(){
		return scope;
	}
	return f;
}
var foo = checkscope();
foo();

执行过程如下:

  1. 进⼊全局代码,创建全局执⾏上下⽂,全局执⾏上下⽂压⼊执⾏上下⽂栈;
  2. 全局执⾏上下⽂初始化;
  3. 执⾏ checkscope 函数,创建 checkscope 函数执⾏上下⽂, checkscope 执⾏上下⽂
    被压⼊执⾏上下⽂栈;
  4. checkscope 执⾏上下⽂初始化,创建变量对象、作⽤域链、this等;
  5. checkscope 函数执⾏完毕, checkscope 执⾏上下⽂从执⾏上下⽂栈中弹出;
  6. 执⾏ f 函数,创建 f 函数执⾏上下⽂,f 执⾏上下⽂被压⼊执⾏上下⽂栈;
  7. f 执⾏上下⽂初始化,创建变量对象、作⽤域链、this等;
  8. f 函数执⾏完毕,f 函数上下⽂从执⾏上下⽂栈中弹出;

当 f 函数执⾏的时候,checkscope 函数上下⽂已经被销毁但是f 执⾏上下⽂维护了⼀个作⽤域链,因为这个作⽤域链,f 函数依然可以读取到 checkscope 函数上下⽂中变量对象的值,说明当 f 函数引⽤了
checkscope 函数上下⽂中变量对象的值的时候,即使 checkscope 函数上下⽂被销毁了,但是JavaScript 依然会让checkscope 函数上下⽂中变量对象活在内存中,f 函数依然可以通过 f 函数的作⽤域链
找到它,正是因为 JavaScript 做到了这⼀点,从⽽实现了闭包这个概念。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值