美文网首页
02 JS 执行环境与作用域链

02 JS 执行环境与作用域链

作者: Android_小生 | 来源:发表于2019-07-14 19:10 被阅读0次

1.执行环境

执行环境定义了变量或函数有权访问的其它数据,决定了它们各自的行为。每个执行环境都有与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。

每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。

2.作用域链

// 示例 1
function compare(value1, value2) {
    if(value1 < value2) {
        return -1;
    } else if(value1 > value2) {
        return 1;
    } else {
        return 0;
    }
}
// undefined
let result = compare(5, 10);
// undefined
result;
// -1

分析示例 1 代码:

先定义了一个 compare() 函数,然后在全局作用域中调用了它。当该函数被调用时,会创建一个执行环境(compare 的执行环境)及相应的作用域链。使用 arguments 和其它命名参数的值来初始化函数的活动对象。在作用域链中,外部函数的活动对象始终处于第二位,...直至作为作用域链终点的全局执行环境。

作用域链

作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。

无论什么时候在函数中访问一个变量时,就会从作用域链中搜索具有相应名字的变量。一般来说,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。但是,闭包的情况又有所不同。关于闭包在下一章详细介绍。

3.延长作用域链

虽然执行环境的类型只有两种:全局和局部(函数),但还有其它办法来延长作用域链。因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。

  • try-catch 语句的 catch
  • with 语句

4.总结

  • 执行环境定义了变量或函数有权访问其它数据;
  • 每个执行环境都有与之对应的变量对象,环境中定义的所有变量或函数都保存在这个对象中;
  • 某个执行环境中的所有代码执行完毕后,该环境会被销毁。保存在其中的变量或函数定义也会被销毁;
  • 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境被推入一个环境栈中,函数执行后,栈会将其弹出,将控制权返回给之前的执行环境;
  • 当代码在一个环境中执行时,会创建变量对象的一个作用域链;
  • 作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问;
  • 每个环境都可以向上搜索作用域链,以查询变量和函数名。

注:文章参考总结自 《JavaScript 高级程序设计》(第 3 版)[美] Nicholas C.Zakas 著 第 73 页。

相关文章

  • javascript的执行上下文—作用域链 闭包

    js作用域:函数作用域、全局作用域作用域链:由当前环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访...

  • 02 JS 执行环境与作用域链

    1.执行环境 执行环境定义了变量或函数有权访问的其它数据,决定了它们各自的行为。每个执行环境都有与之关联的变量对象...

  • JS_0: 执行环境和作用域链

    JavaScript,目前对于执行环境和作用域链的理解 什么是作用域链? 要讲作用域链就得先讲执行环境。 每个函数...

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • js执行环境(作用域)与作用域链

    一般情况下,我们把执行环境分为全局执行环境和局部执行环境,其中局部执行环境我们又可以称之为函数执行环境。通俗的说,...

  • js函数中的this

    前两篇文章“执行环境和作用域”和“js中的闭包”,我对谈了执行环境、作用域、作用域链和闭包的理解。但当牵涉到对象中...

  • JS执行环境与作用域链

    执行环境 执行环境(excecution context),也叫做执行上下文,定义了变量或函数有权访问的其他数据,...

  • 2019-07-21

    JS作用域链 当代码在一个环境中执行时,会创建变量对象的一个作用域链来保证对执行环境有权访问的变量和函数的有序访问...

  • 深入理解JavaScript作用域链

    要讲清楚作用域链,我们首先要从JS中的一个重要概念讲起——执行环境 执行环境与变量对象 执行环境定义了变量或者函数...

  • Javascript 作用域链、闭包的理解和应用

    1. 什么是作用域,作用域链 作用域,指代码所在的执行环境。代码执行时产生的最先产生的执行环境,称为全局作用域, ...

网友评论

      本文标题:02 JS 执行环境与作用域链

      本文链接:https://www.haomeiwen.com/subject/jelikctx.html