0

0

javascript什么是作用域_全局和局部作用域如何划分【教程】

夢幻星辰

夢幻星辰

发布时间:2026-02-01 22:51:35

|

468人浏览过

|

来源于php中文网

原创

词法作用域指变量可访问性由源码中声明位置决定,而非调用时的执行上下文;JS在解析阶段即确定函数能访问的变量,与调用方式无关。

javascript什么是作用域_全局和局部作用域如何划分【教程】

JavaScript 的作用域不是靠“声明位置”直观看出来的,而是由函数定义时的词法环境决定的——也就是说,function 创建的作用域在写代码时就固定了,和怎么调用无关。

什么是词法作用域(Lexical Scope)

词法作用域指变量的可访问性取决于它在源码中声明的位置,而不是运行时的调用。JS 引擎在解析阶段就确定了每个 function 能访问哪些变量。

常见误解:以为 var 声明在 iffor 里会生成局部作用域——不会。iffor 没有块级作用域(ES5 及以前),只有 functioneval 和 ES6 的 let/const 块才创建新作用域。

  • var 声明会被提升到其所在函数(或全局)顶部,且不绑定块
  • letconst 有块级作用域,但不会被提升(存在暂时性死区 TDZ)
  • function 声明也会被提升,且创建独立词法环境

全局作用域 vs 函数作用域的实际表现

全局作用域是所有未被任何 function 包裹的变量所在的地方;函数作用域则是每次调用 function 时创建的私有环境,内部可访问自身声明 + 外层作用域变量(闭包基础)。

立即学习Java免费学习笔记(深入)”;

容易踩的坑:

  • 在全局作用域用 var 声明,会自动挂到 window浏览器)或 global(Node.js)上;用 let/const 则不会
  • 嵌套函数内修改外层 var 变量,会影响外层;但若用 let 声明同名变量,则是遮蔽(shadowing),互不影响
  • this 不属于作用域链,它的值由调用方式决定,和词法作用域无关

示例:

阶跃星辰开放平台
阶跃星辰开放平台

阶跃星辰旗下开放平台,提供文本大模型、多模态大模型、繁星计划

下载
function outer() {
  var a = 1;
  let b = 2;
  function inner() {
    console.log(a); // 1,可访问外层 var
    console.log(b); // 2,可访问外层 let
  }
  inner();
}

ES6 的块级作用域(let/const)如何改变行为

ifforswitch 等语句块现在能形成独立作用域,但仅对 letconst 有效,var 仍泄漏到函数或全局。

典型问题场景:

  • for (var i = 0; i console.log(i), 0) 输出三个 3(因为只有一个 i,循环结束时值为 3
  • 改成 let i,每次迭代都绑定新绑定,输出 012
  • const 声明不可重新赋值,但对象属性仍可修改(绑定不可变,值可变)

为什么 evalwith 是例外

eval 在非严格模式下可动态创建变量,影响当前作用域;严格模式下它有自己独立作用域。而 with 会把传入对象临时注入作用域链顶端,导致变量查找顺序混乱、性能差、严格模式下直接禁用。

所以:永远不要用 with;避免在生产环境用 eval;现代打包工具(如 Webpack)遇到 eval 通常会跳过优化。

真正需要动态执行代码时,优先考虑 Function 构造函数(它只访问全局作用域,更可控)。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

234

2025.12.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

848

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

570

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

442

2024.03.13

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

565

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

451

2023.07.18

Go Web框架Gin接口开发与中间件设计实践
Go Web框架Gin接口开发与中间件设计实践

本专题围绕 Go 在 Web 后端开发中的主流框架 Gin 展开,系统讲解高性能接口开发与中间件机制设计。内容涵盖路由分组、请求绑定、参数校验、统一响应封装、日志与鉴权中间件实现,以及接口限流与异常处理策略。通过实战项目案例,帮助开发者构建结构清晰、性能优良的 Go Web 服务体系,提升接口开发效率与系统可维护性。

7

2026.03.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号