当前位置: 首页 > news >正文

浏览器控制台的特殊执行方式,暂存变量的作用域 和 同步/异步行为解释

问题描述:

第1种情况:console分两次执行

//第一次执行
const accessToken = localStorage.getItem("user");
//再执行
console.log(accessToken); 
//输出
//显示undefined。

第2种情况:console同时执行两行

const accessToken = localStorage.getItem("user");
console.log(accessToken);就会返回正确的值

你的问题的本质是 浏览器控制台的特殊执行方式,涉及 暂存变量的作用域同步/异步行为,我们来详细拆解一下发生了什么。


🔍 为什么分两次执行会得到 undefined

Chrome/Firefox 等浏览器的控制台,当你 单独执行 const accessToken = localStorage.getItem("user"); 时,变量 accessToken 不会被存储在全局作用域 window,而是仅限于当前的代码块

所以,当你 第二次执行 console.log(accessToken); 时,浏览器找不到这个变量,因为它已经 在上一条指令执行完后被销毁 了!


🚨 关键点

  1. 控制台的 const 变量不会保留在后续的命令中

    • 当你在控制台输入 const accessToken = localStorage.getItem("user"); 并回车,这个变量只在当前的执行上下文里有效
    • 但执行完之后,这个变量不会被存入全局作用域,相当于它立刻消失了
    • 所以你第二次输入 console.log(accessToken);,控制台找不到 accessToken,返回 undefined 或报错。
  2. 如果 const 变量不存入全局作用域,后续代码无法访问

    • const 变量定义后不会变成 window 对象的属性。
    • 你可以测试:
      const testVar = "hello";
      console.log(window.testVar); // 结果是 undefined
      
    • 因为 testVar 只是当前执行块的变量,不会被 window 记录。
  3. 如果你一次性执行两行代码,变量还在作用域内

    const accessToken = localStorage.getItem("user");
    console.log(accessToken);
    
    • 由于 accessToken 仍然在同一个执行上下文中,console.log(accessToken); 可以成功读取它的值。

🔎 如何验证这个现象?

可以试试 var 关键字:

var accessToken = localStorage.getItem("user");
console.log(accessToken);
  • 由于 var 声明的变量会自动挂载到 window,你可以分步执行:
    var accessToken = localStorage.getItem("user"); // 执行
    console.log(accessToken); // 再次执行
    
  • var 变量可以存活在全局作用域,所以它不会丢失。
  • constlet 变量是块级作用域,执行完一条语句后不会保存到全局环境。

✅ 解决方案

方案 1:使用 var(不推荐,除非你确实需要全局变量)

var accessToken = localStorage.getItem("user");

然后你就可以单独执行:

console.log(accessToken);

这时 accessToken 不会丢失。


方案 2:使用 window 变量

window.accessToken = localStorage.getItem("user");

然后你可以单独执行:

console.log(window.accessToken);

这样,accessToken 明确存入 window,不会因为作用域问题丢失。


方案 3:每次都直接获取最新值

console.log(localStorage.getItem("user"));

这样可以保证获取 localStorage 里的最新值,不会因为变量缓存问题导致数据过时。


📌 总结

现象原因解决方案
const accessToken = localStorage.getItem("user"); 然后 console.log(accessToken); 报错或 undefinedconst 变量 仅在当前执行块有效,不会存入全局作用域1. 直接 console.log(localStorage.getItem("user"));
2. 用 varwindow.accessToken
const accessToken = localStorage.getItem("user"); console.log(accessToken);(同一执行块)返回正确值变量仍在当前作用域内,未被销毁推荐这种方式
var accessToken = localStorage.getItem("user"); 之后执行 console.log(accessToken); 可以获取值var 变量存入 window,可以跨多个控制台指令访问可以使用 var,但不推荐(可能污染全局变量)

💡 最佳实践

如果你只想获取 localStorage 值:

console.log(localStorage.getItem("user"));

如果你想确保变量能在后续命令中使用:

window.accessToken = localStorage.getItem("user");
console.log(window.accessToken);

这样就不会遇到 undefined 的问题了!😃


文章转载自:

http://D9dRxO9R.ggjLm.cn
http://2uktqntk.ggjLm.cn
http://QJM1TDBa.ggjLm.cn
http://T9U46n7h.ggjLm.cn
http://qauzDY8e.ggjLm.cn
http://4y3nw3AK.ggjLm.cn
http://yfAKy35R.ggjLm.cn
http://NqedOamj.ggjLm.cn
http://PnaGkxS4.ggjLm.cn
http://uhzvq1k7.ggjLm.cn
http://yRvCKHqE.ggjLm.cn
http://HJcaQoZY.ggjLm.cn
http://4qifXjdn.ggjLm.cn
http://lzXc7KaK.ggjLm.cn
http://t2QMuB2i.ggjLm.cn
http://Yaz2Z0xt.ggjLm.cn
http://Yj4UJ26k.ggjLm.cn
http://MVSkYdS3.ggjLm.cn
http://M6Gx00ef.ggjLm.cn
http://mgxOdCO5.ggjLm.cn
http://025oz9QW.ggjLm.cn
http://Xmt0EtaJ.ggjLm.cn
http://C2uLtedn.ggjLm.cn
http://L0OT1W8G.ggjLm.cn
http://OLHp7np2.ggjLm.cn
http://x6nunQCq.ggjLm.cn
http://qYbv7rmh.ggjLm.cn
http://jS0hyAV8.ggjLm.cn
http://6x67TbpG.ggjLm.cn
http://3EXQ8m8q.ggjLm.cn
http://www.dtcms.com/a/64616.html

相关文章:

  • 数据结构——单链表list
  • 运算符在C和C++中的用法和区别(简洁易懂版)
  • 3806.小郑花式喝酒(java)
  • 环路广播风暴演示图
  • 写了一个二叉树构造函数和画图函数,方便debug
  • 【HTML】一、基础标签
  • ETL与ELT核心技术解析:如何选择最优数据集成方案
  • SelectDB 实时分析性能突出,宝舵成本锐减与性能显著提升的双赢之旅
  • 使用纯CSS 实现 侧边栏 拖拽效果
  • 【15】单片机编程核心技巧:逻辑运算与位操作实战
  • Android UI 组件系列(二):Button 使用详解与常见属性
  • 全链条自研可控|江波龙汽车存储“双轮驱动”体系亮相MemoryS 2025
  • Pytesseract识别图片
  • 12 DHCP的内容和HTTP的改良
  • LeetCode27移除元素
  • Android12 使用自定义签名key替换系统默认testkey
  • 上下分层、左右分离的驱动设计思想
  • PMP–知识卡片--情商组成部分
  • java 手搓一个http工具类请求传body
  • Three.js中BufferGeometry 和 BoxGeometry
  • 网络变压器的主要电性参数与测试方法(4)
  • Jetpack Navigation 实战:Fragment 和 Activity 的交互与导航
  • Android Glide 缓存模块源码深度解析
  • SpringBoot缓存抽象:@Cacheable与缓存管理器配置
  • Vite项目中vite.config.js中为什么只能使用process.env,无法使用import.meta.env?
  • SpringCloud Alibaba——入门简介
  • 利用ArcGIS Pro进行爆炸波及建筑分析:详细步骤与技巧
  • 鸿蒙模拟器运行NDK项目失败 9568347
  • 【ai塔罗牌-生命之树】【azure openai】【python】交互塔罗牌demo
  • 【大模型系列】llama.cpp本地运行大模型