JavaScript的环境模型

本文详细探讨了JavaScript的环境模型,包括环境是什么、环境模型、变量环境、环境创建与作用、变量绑定、约束变量和自由变量等概念。通过示例解释了函数在计算过程中的环境变化,阐述了环境引用如何保存并回溯到变量定义时的环境以获取绑定。同时,介绍了如何用JavaScript模拟环境模型,并讨论了作用域、作用域链以及变量的消失。最后,通过实例展示了如何验证环境模型和作用域链的工作原理。
摘要由CSDN通过智能技术生成

JavaScript的环境模型

《SICP》提到了 环境模型(Environment Model) 这一个概念,它用于解释Scheme的函数计算规则。同样,它也适用于JavaScript的函数计算规则。

环境是什么

节选《SICP》 3.2 The Environment Model of Evaluation

The environment is crucial to the evaluation process, because it determines the context in which an expression should be evaluated. Indeed, one could say that expressions in a programming language do not,in themselves, have any meaning. Rather, an expression acquires a meaning only with respect to some environment in which it is evaluated. Even the interpretation of an expression as straightforward as (+ 1 1) depends on an understanding that one is operating in a context in which + is the symbol for addition.

翻译

环境在计算过程必不可少,因为它决定了计算表达式的上下文。 可以这样认为,表达式本身在程序语言里毫无意义,表达式的意义取决于它计算时所在的环境。就算是 (+ 1 1)这一条极其简单的表达式,也需要在符号+表示加法的上下文里才能进行计算。

JavaScript的解释器就充当着环境的角色。在该环境下,表达式1 + 1的计算结果为2,表达式Date()调用一个函数并返回当前的时间,表达式() => 1定义了一个返回1的函数……总之,对程序而言,环境就是在计算过程为符号提供实际意义的东西。

环境模型

变量环境

环境模型中的环境具体指的是变量环境。函数在计算时会根据 环境(environment) 决定变量的值,从而决定它的计算结果。

环境的创建和作用

函数在调用时会先创建一个环境,然后在该环境中计算函数的内容。

function add10(value) { //1
    var increment = 10; //2
    return value + increment;   //3
}   //4
add10(2);   //5

表达式add10(2)(>5)的计算过程:

  1. 创建环境$add10。(>5)
  2. 给环境$add10中的变量value赋值2。(>5)
  3. 进入环境$add10。
  4. 在环境$add10中,给变量increment赋值10。(>2)
  5. 在环境$add10中,获得变量value的值2。(>3)
  6. 在环境$add10中,获得变量increment的值10。(>3)
  7. 计算表达式2 + 10得到12。(>3)
  8. 返回12。(>3)
  9. 离开环境$add10。

值得一提的是,形参也是变量,它在形参列表里定义,在函数调用时获得初始值。

变量绑定

环境使用变量绑定来存放变量的值, 绑定(binding) 与函数中的变量一一对应。

约束变量和自由变量

在函数中定义一个变量,变量的意义取决于函数的内容,它的作用范围也被约束在函数之中,此时的变量被称为 约束变量(bound variable) 。 
在函数中使用一个没有定义的变量,它的作用范围不受函数的约束,此时的变量被称为 自由变量(free variable) 

function main() {   //1
    var x = 10; //2
    var addX = function (value) {   //3
        var increment = x;  //4
        return value + increment;   //5
    };  //6

    var value = 2;  //7
    addX(value);    //8
}   //9
main(); //10

var关键字可以定义变量:

  • 在函数main中,变量x(>2、4),addX(>3、8),value(>7、8)皆为约束变量。
  • 在函数addX中,变量value(>3、5),increment(>4、5)是约束变量,变量x(>4)是自由变量。

绑定与变量

在函数的计算过程中,变量定义会使当前的环境加入对应的绑定。

上文中表达式main()(>10)的计算过程产生了2个环境,$main和$addX:

  • 环境$main拥有3个绑定,*x,*addX,*value。
  • 环境$addX拥有2个绑定,*value,*increment。

可见,绑定存放的是约束变量的值,约束变量的值可以直接从当前环境获取。
而自由变量的值需要从其他环境获取,该环境是自由变量定义时所在的环境,拥有自由变量的绑定。

上文中表达式addX(value)(>8)的计算过程:

  1. 获得环境$main中绑定*addX的值addX函数。(>8)
  2. 获得环境$main中绑定*value的值2。(>8)
  3. 修改环境$addX中绑定*value的值为2。(>8)
  4. 获得环境$main中绑定*x的的值10。(>4)</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值