如何理解js中的词法环境

概念:
  词法环境是JavaScript中用于定义标识符绑定(即变量和函数的名称)的规则和方式的一种规范概念。在ES6(ECMAScript 2015)及之后的版本中,词法环境被引入来替代之前的变量对象(Variable Object)和活动对象(Activation Object)的概念
一. 定义
   词法环境是由两部分组成的:
   1.环境记录(Environment Record):存储变量和函数声明的实际位置。
   2.外部词法环境引用(Outer Lexical Environment):指向包含当前词法环境的下一个外部词法环境。
   
二. 环境记录
   环境记录有两种类型:
   1.声明式环境记录(Declarative Environment Record):用于函数和模块环境。它存储变量、函数和参数的绑定。
   2.对象式环境记录(Object Environment Record):用于全局环境。它将绑定映射到对象的属性。
   
三. 词法环境的作用
   1.标识符解析:当访问一个变量或调用一个函数时,JavaScript引擎会使用词法环境来查找这些标识符的绑定。
   2.作用域链:词法环境构成了作用域链的一部分,它允许内部环境访问外部环境的变量和函数。
   
四. 词法环境的创建
    每当执行一个函数时,都会创建一个新的词法环境。这个新的词法环境会包含以下内容:
    1.环境记录:存储该函数内部声明的变量和函数。
    2.外部词法环境引用:指向函数外部环境的词法环境。
五.示例
   function outer() {
	    var outerVar = 'I am outer';
	    function inner() {
	        var innerVar = 'I am inner';
	        console.log(outerVar); // 输出:I am outer
	    }
	    inner();
	}
   outer();
在这个例子中:
  1.outer() 的执行创建了一个包含 outerVar 和 inner() 的词法环境。
  2.inner() 被调用时,它创建了一个新的词法环境,其中包含 innerVar。
  3.inner() 的外部词法环境引用指向 outer() 的词法环境,因此 inner() 可以访问 outerVar。

六. 闭包
词法环境也是理解JavaScript闭包的关键。闭包允许函数访问并操作其外部词法环境中的变量,即使外部函数已经返回。
	function createCounter() {
	    let count = 0;
	    return function() {
	        count += 1;
	        return count;
	    };
	}
	
	let counter = createCounter();
	console.log(counter()); // 输出:1
	console.log(counter()); // 输出:2
在这个例子中,返回的匿名函数可以访问并修改 createCounter 的词法环境中的 count 变量,即使 createCounter 已经执行完毕。这是因为返回的函数保存了对 createCounter 词法环境的引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值