👨‍💻
Hong's 前端笔记
  • 🌈About
  • JavaScript
    • 作用域
    • 闭包
    • this
      • bind()
    • 原型
      • Object.create()
      • 模拟“类”
      • ES6 Class
      • Function
    • 对象
    • 类型 & 值
      • 原生函数
      • 数组
      • 字符串
    • 异步
    • JavaScript 相关概念
      • Event Loop 事件循环
      • Prototype 原型
      • Context 执行上下文
      • this
      • Promise
    • JavaScript 常见问题
      • 手写实现
      • 看代码输出
  • React
    • 核心概念
    • 深入理解
      • State
      • 如何管理 State
      • React 渲染过程
      • 处理 DOM 事件
      • Pure 组件
      • Context
      • Key 属性
      • React.lazy()
      • Render Props
    • Hooks
      • useState
      • useRef
      • useEffect
        • Some details
      • 相关概念
      • 自定义 Hook
      • useEffect vs useLayoutEffect
    • React 相关问题
      • Class vs Function
  • React Libraries
    • Redux
      • Quick Start
      • 如何持久化 Redux 数据
      • 异步操作
      • 性能优化
      • Dive into immutability
    • Route v6
      • Quick Start
  • Reactivity
    • Immer
  • Vue
    • 深入理解
      • Composition vs Options
      • Reactivity
  • Network
    • Cookies
    • HTTP
    • HTTPS
    • CORS 跨域资源共享
    • 认证手段
    • 安全相关
    • 网络相关知识
  • Browser
    • DOM 操作
    • Events 事件
    • XHR & Fetch
    • 性能优化
    • HTML 相关概念
    • 浏览器相关概念
  • CSS
    • 盒模型
    • Layout 布局
    • Styles 样式
    • CSS 相关概念
    • CSS 相关技巧
      • 移动端适配
      • Flex
      • 动画
  • TypeScript
    • Quick Peek
    • Types in TypeScript
    • Narrowing
    • Functions in TypeScript
  • Workflow
    • Webpack
      • Webpack 概念
      • 资源管理
      • 管理输出
      • 开发环境配置
      • 生产环境配置
      • 优化代码运行性能
  • Others
    • 小程序与原生 Web 的区别
  • SSO
    • About
    • API Doc
    • 接入指南
Powered by GitBook
On this page
  • 概述
  • 执行环境
  • 词法作用域 / 静态作用域
  • 块级作用域
  • 创建作用域的方法
Edit on GitHub
  1. JavaScript
  2. JavaScript 相关概念

Context 执行上下文

概述

执行环境分为三种

  1. 全局,即 window / global

  2. 函数执行环境

  3. Eval 函数

每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。

执行环境

用一个栈里维护执行环境,默认栈底就是 global

每当一个函数执行时,就压入这个函数的执行环境,函数执行完毕后,再弹出,然后把控制权交给之前的环境。

// 示例代码
var name = "Jack";
function func() {
  console.log(name); // 访问全局作用域
}

function func2() {
  var name = "啊哈哈";
  console.log(name); // 访问函数内部作用域
}

func(); // Jack
func2(); // 啊哈哈

词法作用域 / 静态作用域

静态作用域:函数被定义的时候,它的作用域就已经确定了,和拿到哪里执行没有关系。

JavaScript 使用的就是静态作用域,参考下面例子

var value = 1;

function foo() {
  console.log(value);
}

function bar() {
  var value = 2;
  foo();
}

bar();	// 结果是: 1

上述代码三个作用域:全局、foo()、bar()

因为 foo() 中没有 value,那他就要向上层寻找

块级作用域

JS 默认只用两种作用域:全局作用域 / 函数作用域。使用 {} 包裹起来的是块级作用域。

if (false) {
    var foo = 'bar'
}
console.log(foo)	// undefined foo 被变量提升了

使用 var 创建的变量是没有块级作用域的。然而,使用 let const 是可以创建的

if (false) {
    const foo = 'bar'
}
console.log(foo)	// ReferenceError

创建作用域的方法

函数式作用域

function foo() { }

使用 let / const 创建块级作用域

for (let i = 0; i < 10; i++) {
    console.log(i)
}
console.log(i)		// ReferenceError

Last updated 3 years ago