Lexical Environment词法环境
- 什么是词法环境
- 词法环境是一种规范类型,用于定义标识符与特定对象的关联,基于
ESMAScript的词法嵌套结构的变量和函数
// _讨论_ 当前关于放置的词法(Lexical)
// 当前的(this)放在你代码的说明位置
var num1 = 10;
// 2. test函数在全局环境中,变量num1也是如此
function test() {
// 1.变量num2 是在test函数内部定义的
var num2 = 10;
}
// 总结:
// num1,test的词法环境再window中
// num2 的词法环境在 test 中
作用域链和作用域
- 作用域链决定可以访问什么功能,代码执行的时候可以访问什么
技巧如果是兄弟关系变量不能共享,父子类关系:可共享
Scope and the Scope Chain(作用域和作用域链)
概念
重要性=> 是构建任何代码的重要基础
1.什么是作用域
- 一组规则,用于确定引入的
项(items),变量(variables),函数(function)可以访问
2.什么是作用域(官方回答)
-
定义作用域值变量或函数可执行的可见性代码
- 在 JS 中,如果变量或函数在当前词法(excuting)中,则它会执行代码可见
-
作用域是由词法(Lexical)决定的
- 你在哪里定义你的函数将决定他们是否可访问通过某些代码,取决于哪些变量和函数的关系
-
JS 使用函数作用域,所以一个函数创建一个执行上下文和环境变量 => 使用该执行啥下文创建的内容有助与确定我们的
作用域 -
如果是引用项,则表示变量或函数在局部作用域内不可用
- 引擎遍历作用域链寻找它
-
嵌套函数,作用域,创建的作用域链
3.什么是作用域链
- 父词法环境和当前环境的父等
- 所以一个链,JS 引擎使用它来确定它是否可以访问一个函数或一个可变
4.作用域的作用
- 标识在上下文中哪些变量和函数可以从内引用
代码
// 步骤
// - 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);