单元二之第五章词法环境及作用域和作用域链

109 阅读3分钟

Lexical Environment词法环境

  1. 什么是词法环境
  • 词法环境是一种规范类型,用于定义标识符与特定对象的关联,基于 ESMAScript 的词法嵌套结构的变量和函数
// _讨论_ 当前关于放置的词法(Lexical)
// 当前的(this)放在你代码的说明位置
var num1 = 10;
// 2. test函数在全局环境中,变量num1也是如此
function test() {
  // 1.变量num2 是在test函数内部定义的
  var num2 = 10;
}
// 总结:
// num1,test的词法环境再window中
// num2 的词法环境在 test 中

作用域链和作用域

  1. 作用域链决定可以访问什么功能,代码执行的时候可以访问什么
  2. 技巧如果是兄弟关系变量不能共享,父子类关系:可共享

Scope and the Scope Chain(作用域和作用域链)

概念

  • 重要性 => 是构建任何代码的重要基础

1.什么是作用域

  1. 一组规则,用于确定引入的项(items),变量(variables),函数(function)可以访问

2.什么是作用域(官方回答)

  1. 定义作用域值变量或函数可执行的可见性代码

    1. 在 JS 中,如果变量或函数在当前词法(excuting)中,则它会执行代码可见
  2. 作用域是由词法(Lexical)决定的

    1. 你在哪里定义你的函数将决定他们是否可访问通过某些代码,取决于哪些变量和函数的关系
  3. JS 使用函数作用域,所以一个函数创建一个执行上下文和环境变量 => 使用该执行啥下文创建的内容有助与确定我们的作用域

  4. 如果是引用项,则表示变量或函数在局部作用域内不可用

    1. 引擎遍历作用域链寻找它
  5. 嵌套函数,作用域,创建的作用域链

3.什么是作用域链

  1. 父词法环境和当前环境的父等
    1. 所以一个链,JS 引擎使用它来确定它是否可以访问一个函数或一个可变

4.作用域的作用

  1. 标识在上下文中哪些变量和函数可以从内引用

代码

// 步骤
// - JS引擎首先执行这段代码
// 1. 一个全局执行上下文被创建
// 2. 内次调用一个函数,函数执行上下创建并添加到调用堆栈(call stack)
// _注意:_ 每个上下文都需要建立作用域,哪些变量

// 作用域:a(10),add5(fn)
var a = 10;
var add5 = function (num) {
  // 作用域: b(string),add10(fn),add15(fn),
  var b = 5;
  console.log(num + b);
  var add10 = function (num2) {
    // 作用域: num2(num:3)
    // _注意_ a在全局作用域上,此时能访问得到a
    // _原因_ 会在局部作用域{local scope}中查找 => 找不到回到父级(add5)中查找找不到 => 顶级作用域中查找
    console.log(num2 + a);
  };
  add10(3);
  var add15 = function (num3) {
    // 作用域:num3(num3:3),c(15)
    var c = 15;
    console.log(num3 + c);
  };
  add15(3);
};
add5(3);