JavaScript 执行上下文与作用域
一、执行上下文
JavaScript 执行上下文是指 JavaScript 引擎在执行代码时的环境。它包含了代码所需的所有信息,包括变量对象、作用域链、this 对象等。
JavaScript 引擎在执行代码时会创建一个执行上下文栈,用于维护当前执行上下文。每当执行一个函数时,JavaScript 引擎会创建一个新的执行上下文并将其压入栈顶。当函数执行完成后,JavaScript 引擎会弹出栈顶的执行上下文。
二、作用域
作用域是指 JavaScript 中变量和函数的可访问范围。JavaScript 中有全局作用域和局部作用域。
1、全局作用域
全局作用域中的变量和函数在整个程序中都可以访问。
JavaScript 中的变量查找遵循作用域链的原则,即先在当前作用域中查找变量,如果没有找到,则在父作用域中查找,直到全局作用域。
JavaScript 中的作用域链的顶部永远是全局作用域,每当你调用一个函数时,它会创建一个新的执行上下文并将其加入到作用域链中。
2、局部作用域(函数作用域)
局部作用域中的变量和函数只能在特定的代码块中访问。
在 JavaScript 中,函数作用域是通过函数被调用的地方来确定的,而不是函数被定义的地方,这称为词法作用域。
3、块级作用域
在javascript中,除了全局作用域和函数作用域,还有块级作用域,在使用 let 和 const 定义变量时会产生块级作用域。
在 JavaScript 中,函数作用域和块级作用域是独立的,所以在块级作用域中使用 var 声明的变量会污染到所在函数作用域中,造成命名冲突。而 let 和 const 声明的变量只会在其所在的块级作用域中可见。
4、特殊作用域
JavaScript 中还有一种特殊的作用域,即闭包。闭包是一种非常强大的技术,可以用来实现私有变量、保持状态、缓存等功能。闭包是指通过一个函数引用其上层作用域中的变量来实现的,并且在函数返回后,仍然可以访问这些变量。这种特殊的作用域使得函数可以“记住”它所在的环境。
三、提升
JavaScript 中有两种变量声明方式:var 和 let/const, var 声明的变量会被提升到作用域顶部,而 let/const 声明的变量只能在它们声明的代码块中使用。
JavaScript 中的执行上下文和作用域与其他编程语言有着相似之处,但也有一些不同之处。
一个重要的不同之处是 JavaScript 中的作用域是动态的,可以在运行时通过改变作用域链来访问和修改变量。而其他语言中的作用域通常是静态的,在编译时就已经确定了。
另一个不同之处是 JavaScript 中的 this 对象是在运行时确定的,而不是在编译时确定的。这意味着 this 的值可能会在代码执行过程中发生变化,这在调试和理解 JavaScript 代码时需要特别注意。
JavaScript 中执行上下文和作用域的运行机制也是经典的单线程运行模式,这意味着 JavaScript 代码会在单个线程中执行,不能同时执行多个任务。
相关文章
- 【JavaScript】attribute和property的区别(包括Dom详解)
- 技术分享 | web自动化测试-执行 JavaScript 脚本
- 【学习笔记02】JavaScript的变量和命名规范
- 26dwr - DWR中的JavaScript(创造一个与 Java 对象匹配的 Javascript 对象)
- 59 爬虫 - Selenium案例(执行 JavaScript 语句)
- Javascript 与 SPA单页Web富应用
- 如何选择Javascript模板引擎(javascript template engine)?
- 【JavaScript】JavaScript脚本代码的位置及在页面中的执行顺序
- 【JavaScript】重温Javascript继承机制
- 【JavaScript】Understanding callback functions in Javascript
- javascript事件设计模式
- javascript中脚本加载和执行机制
- JavaScript-每隔5分钟执行一次ajax请求的实现方法
- 《JavaScript忍者秘籍》——第1章 进入忍者世界 1.1即将探索的JavaScript库
- 《JavaScript框架设计》——1.5 主流框架引入的机制——domReady
- 《JavaScript机器人编程指南》——1.1 理解JS机器人技术、NodeBots和Johnny-Five
- Javascript脚本运算符执行顺序对照表
- 浏览器工作原理:浅析this - 从JavaScript执行上下文的视角讲清楚this
- 华为OD机试 - 双十一(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- JavaScript定时调用函数(SetInterval与setTimeout)
- 【javascript】Javascript中"||"的妙用
- JavaScript中bind函数的使用
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
- JavaScript之JS的执行环境和作用域
- 深入理解JavaScript系列(9):根本没有“JSON对象”这回事!