当前位置: 首页 > 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 的问题了!😃

相关文章:

  • 数据结构——单链表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
  • 机关网站建设方案/网络营销推广方式有哪些
  • 滨州正规网站建设公司/海南百度推广seo
  • 邯郸网站建设的企业/免费涨热度软件
  • 宁波靠谱的网站推广定制/怎么在百度上发布个人文章
  • 个人注册网站怎么注册/网络推广运营公司
  • 住房和城乡建设部网站安全分会/检测网站是否安全