深入理解JavaScript-作用域 VS 执行上下文

简介: 深入理解JavaScript-作用域 VS 执行上下文

笔者在前文 作用域执行上下文 中介绍过作用域和执行上下文,它们是 JavaScript 中很重要的知识点,是基础中的重点,是重点中的基础。


我们讲过 JavaScript 中的作用域是词法作用域,与在哪里定义有关;而执行上下文则和调用有关,两者有关联但却是不同概念


作用域


  • 作用域与哪里定义有关,在引擎编译时就知道它在哪里定义
  • 其中函数作用域最为重要,因为作用域中的变量,作用域外不能访问,这起到了保护变量的作用
  • 无生命周期
  • 它可以理解为是“静态”的(词法作用域)
  • 共全局作用域、函数作用域、块级作用域、eval 作用域


执行上下文


  • 而执行上下文与调用有关
  • 它表示一段代码执行时所带的所有信息
  • 包括 this、词法环境、变量环境(ES5标准)
  • 结合之前 this 所给的定义:谁调用它,this 就指向谁 就是和执行上下文相关。执行上下文也是如此,与调用者息息相关
  • 生命周期为两个阶段
  • 指向代码
  • 确定作用域链
  • 确定 this 指,即我们熟知的 this 绑定
  • 创建变量环境
  • 创建词法环境
  • 指向父作用域(作用域在代码执行前就确定了)
  • 登记 var、function 等声明的变量
  • 此时会发生变量提升和函数提升
  • 环境记录器
  • 对外部环境的引用(outer)
  • 同样指向父作用域
  • 登记 let、const 等声明的变量
  • 会发生变量提升(hoist),但是不会被初始化,所以提前使用会报 ReferenceError,如例1所示
  • 环境记录器
  • 对外部环境的引用(outer)
  • 创建阶段
  • 执行阶段
  • 它则是“动态”的(与调用方相关)
  • 共全局执行上下文、函数执行上下文、模块执行上下文、eval 执行上下文


例子1:

a // undefined
b // ReferenceError
c // ReferenceError
d // function d() {}
var a = 1;
let b = 2;
const c = 3;
function d(){}


var 声明变量会被初始化为 undefined,一般函数(函数声明式写法)定义会被初始化为 function xx(){} ,let、const 则不会被初始化,所以 var 定义的变量可以提前使用但指为 undefined,一般函数定义可以正常提前使用,let、const 提前使用则会报错


PS,如果使用函数表达式写法使用函数,则跟变量,如 var e = function(){} 或者 let f = () => {}


以上就是作用域和指向上下文的各种区别


相关文章
|
16天前
|
JavaScript 前端开发
js的作用域作用域链
【10月更文挑战第29天】理解JavaScript的作用域和作用域链对于正确理解变量的访问和生命周期、避免变量命名冲突以及编写高质量的JavaScript代码都具有重要意义。在实际开发中,需要合理地利用作用域和作用域链来组织代码结构,提高代码的可读性和可维护性。
|
16天前
|
自然语言处理 JavaScript 前端开发
[JS]作用域的“生产者”——词法作用域
本文介绍了JavaScript中的作用域模型与作用域,包括词法作用域和动态作用域的区别,以及全局作用域、函数作用域和块级作用域的特点。通过具体示例详细解析了变量提升、块级作用域中的暂时性死区等问题,并探讨了如何在循环中使用`var`和`let`的不同效果。最后,介绍了两种可以“欺骗”词法作用域的方法:`eval(str)`和`with(obj)`。文章结合了多位博主的总结,帮助读者更快速、便捷地掌握这些知识点。
29 2
[JS]作用域的“生产者”——词法作用域
|
17天前
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
|
1月前
|
存储 JavaScript 前端开发
深入理解 JavaScript 执行上下文与 this 绑定机制
JavaScript 代码执行时,会为每段可执行代码创建对应的执行上下文,其中包含三个重要属性:变量对象、作用域链、和 this。本文深入剖析了执行上下文的生命周期以及 this 在不同情况下的指向规则。通过解析全局上下文和函数上下文中的 this,我们详细讲解了 this 的运行期绑定特性,并展示了如何通过调用方式影响 this 的绑定对象。同时,文中对箭头函数 this 的特殊性以及四条判断 this 绑定的规则进行了总结,帮助开发者更清晰地理解 JavaScript 中的 this 行为。
72 8
深入理解 JavaScript 执行上下文与 this 绑定机制
|
16天前
|
JavaScript 前端开发
如何在 JavaScript 中实现块级作用域?
【10月更文挑战第29天】通过使用 `let`、`const` 关键字、立即执行函数表达式以及模块模式等方法,可以在JavaScript中有效地实现块级作用域,更好地控制变量的生命周期和访问权限,提高代码的可维护性和可读性。
|
24天前
|
JavaScript 前端开发
javascript的作用域
【10月更文挑战第19天javascript的作用域
|
15天前
|
自然语言处理 JavaScript 前端开发
如何在 JavaScript 中创建执行上下文
在JavaScript中,每当执行一段代码时,都会创建一个执行上下文。它首先进行变量、函数声明的创建和内存分配(即变量环境和词法环境的建立),接着进入代码执行阶段,处理具体逻辑。
|
29天前
|
JavaScript 前端开发
JavaScript 作用域
JavaScript 作用域是指程序中可访问的变量、对象和函数的集合。它分为函数作用域和局部作用域。函数作用域内的变量仅在函数内部可见,而全局作用域的变量在整个网页中均可访问。局部变量在函数执行完毕后会被销毁,而全局变量则在整个脚本生命周期中都存在。未使用 `var` 关键字声明的变量默认为全局变量。
|
15天前
|
存储 自然语言处理 JavaScript
如何在 JavaScript 中创建执行上下文
在JavaScript中,作用域链是一套用于查找变量和函数的机制,由当前执行上下文的变量对象和所有外层执行上下文的变量对象组成。它包括全局作用域、函数作用域和块级作用域。作用域链的工作原理是从内向外逐层查找变量,直至全局作用域。闭包通过作用域链记住其词法作用域,即使在外部作用域之外执行也能访问内部变量。作用域链有助于变量隔离、模块化和数据隐藏,提高代码的可维护性和可读性。
|
1月前
|
JavaScript 前端开发
js作用域
js作用域
16 1