深入理解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 = () => {}


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


相关文章
|
28天前
|
JavaScript 前端开发
浅谈js作用域
浅谈js作用域
25 0
|
18天前
|
JavaScript 前端开发
JavaScript基础知识-作用域(action scope)
关于JavaScript基础知识中作用域的介绍。
23 1
JavaScript基础知识-作用域(action scope)
|
15天前
|
JavaScript 前端开发
JavaScript 作用域
JavaScript 作用域
22 9
|
22天前
|
JavaScript 前端开发
使用 let 将有助于避免 JavaScript 中各种 var 引起的作用域问题。
这段内容介绍了JavaScript编程时的一系列最佳实践,包括使用`===`而非`==`进行比较、以`let`和`const`取代`var`定义变量、始终使用分号、采用合适的命名规范、利用模板字符串拼接、偏好ES6箭头函数、在控制结构中使用大括号、减少代码嵌套、应用默认参数、正确使用`switch`语句中的`break`与`default`分支、避免通配符导入以及简化布尔判断和避免不必要的三元运算符。遵循这些规则有助于提升代码的清晰度和可维护性。
15 2
|
1月前
|
JavaScript 前端开发
JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
这篇文章介绍了JavaScript中对象的基本概念和操作,包括对象属性和方法的使用、对象字面量的创建、函数的定义和作用域的概念,以及全局作用域和局部作用域的区别和特性。
JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
|
1月前
|
自然语言处理 资源调度 JavaScript
JS 逆向基础篇:JS作用域和浏览器对象属性补环境
JS 逆向基础篇:JS作用域和浏览器对象属性补环境
57 1
|
20天前
|
JavaScript 前端开发
|
22天前
|
JavaScript 前端开发 C++
【Vue.js的终极对决】服务端渲染VS客户端渲染:一场关乎速度与SEO的生死较量!
【8月更文挑战第30天】Vue.js 是一个流行的 JavaScript 框架,支持服务端渲染(SSR)和客户端渲染。SSR 在服务器生成完整 HTML,有利于 SEO 并缩短首屏加载时间,但增加服务器负担;客户端渲染则在浏览器生成页面,提升交互性,降低服务器负载。本文通过代码示例对比两者优劣,并提供选择指南,帮助开发者根据 SEO 需求、交互性需求及服务器资源等条件,选择合适的渲染方式,从而优化应用性能和用户体验。
28 0
|
22天前
|
自然语言处理 JavaScript 前端开发
JavaScript 中的作用域
【8月更文挑战第29天】
13 0
|
1月前
|
自然语言处理 JavaScript 前端开发
JS自学——快速了解词法作用域及欺骗词法作用域
JS自学——快速了解词法作用域及欺骗词法作用域