Javascript基礎內容回顧—變量提升、事件循環和閉包等內容

以下是前端面試中 JavaScript 基礎易錯問題的詳解,結合常見考點和易混淆概念進行解析:


?? 一、變量作用域與提升

  1. var vs let/const

? 變量提升:var 聲明的變量會提升到作用域頂部(值為 undefined),而 let/const 存在暫時性死區(聲明前訪問報錯)。

? 循環陷阱:

for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 輸出 3,3,3(共享同一作用域)
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 輸出 0,1,2(塊級作用域)
}

解決:使用 let 或 IIFE(立即執行函數)創建獨立作用域。

  1. 全局變量污染

未使用聲明關鍵字(如 x = 10)會創建全局變量,嚴格模式(“use strict”)可避免此問題。


🔄 二、異步與事件循環

  1. setTimeout 延遲問題

? 即使延遲為 0,回調仍會進入任務隊列,等待同步代碼執行完畢。

? 循環中 var 聲明的變量會在異步回調執行時變為最終值(如循環結束后的 i)。

  1. 事件隊列示例

document.addEventListener(“click”, () => console.log(“Click”)); // 異步事件
function sleep() { /* 同步阻塞 2 秒 */ }
sleep(); // 阻塞期間點擊不會觸發事件,直到同步代碼完成3。


🔗 三、閉包與內存管理

  1. 閉包原理

函數保留其詞法作用域的引用:

function outer() {
let count = 0;
return () => count++; // 閉包持有 count 的引用
}
const counter = outer();
counter(); // 1(變量不會被回收)6,7。

  1. 內存泄漏風險

? 閉包引用大對象時,即使未使用也可能阻止垃圾回收:

function createHandler() {
const data = new Array(1000000);
return () => console.log(data[0]); // data 被閉包持有
}
// 解決:不再需要時手動解除引用(如 data = null)6,7。

? 循環中閉包共享變量需通過參數傳遞值(非引用)。


🔍 四、類型轉換與比較

  1. == 與 ===

? == 隱式類型轉換規則:

[] == ![] // true: ![] → false → 0, [] → “” → 0
0 == “0” // true: 字符串轉數字
null == undefined // true(特殊規則)1,4。

? 優先使用 === 避免意外轉換。

  1. typeof 與 null

typeof null === “object”(歷史遺留 bug),判斷數組用 Array.isArray()。


🧠 五、this 綁定規則

this 由調用方式決定:

const obj = {
name: “A”,
log() {
console.log(this.name); // “A”(obj 調用)
function inner() {
console.log(this); // window(默認綁定)
}
inner();
}
};
obj.log();

? 解決:箭頭函數繼承外層 this,或使用 bind/call 顯式綁定。


📦 六、對象與引用

  1. 深淺拷貝

? 直接賦值是淺拷貝(共享引用):

let a = [1, 2];
let b = a;
b.push(3); // a 也變為 [1,2,3]1,5。

? 深拷貝方法:JSON.parse(JSON.stringify(obj))(不支持函數)或遞歸復制。

  1. 重復屬性名

const obj = { a: “one”, b: “two”, a: “three” };
console.log(obj); // {a: “three”, b: “two”}(后聲明的覆蓋前者)1。


? 七、其他易錯點

  1. 浮點數精度

0.1 + 0.2 !== 0.3(二進制浮點數問題),需用 toFixed(2) 處理。

  1. 稀疏數組

const arr = [1, , 3]; // 中間為空
arr.map(x => x * 2); // [2, empty, 6](跳過空位)4。

  1. switch 嚴格比較

switch (new String(“A”)) {
case “A”: console.log(“Case A”); // 不執行(對象 vs 字符串)
default: console.log(“Unknown”); // 輸出此4。
}


💎 總結

理解這些問題的核心在于:

? 作用域(塊級 vs 函數級)

? 異步機制(事件隊列、微任務/宏任務)

? 引用類型(對象、數組的共享特性)

? 隱式轉換規則(避免用 ==)

面試時不僅要答對,更要解釋背后的原理(如閉包的內存管理、this 的動態綁定),展現深度思考能力。

——
以下是前端面試中 JavaScript 基礎易錯問題的深度解析,結合高頻考點和開發者常見誤區,從原理到解決方案進行系統梳理:


?? 一、作用域與變量聲明

  1. 變量提升與暫時性死區

? var 聲明的變量會提升至作用域頂部(值為 undefined),而 let/const 雖提升但存在暫時性死區(聲明前訪問報錯)。

? 典型陷阱:

for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 輸出 3 個 3(共享同一作用域)
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 輸出 0,1,2(塊級作用域隔離)1
}

解決:優先使用 let 或通過 IIFE 創建獨立作用域。

  1. 全局變量污染

未聲明直接賦值(如 x = 10)會創建全局變量,嚴格模式(“use strict”)可避免此問題。


🔄 二、閉包核心原理與陷阱

  1. 閉包的本質

內部函數持有外部函數作用域的引用,即使外部函數已執行完畢:

function createCounter() {
let count = 0; // 被閉包引用的變量
return () => count++;
}
const counter = createCounter();
counter(); // 1(count 未被回收)6,7

  1. 循環中的閉包陷阱

for (var i = 0; i < 5; i++) {
setTimeout(() => console.log(i)); // 輸出 5 個 5
}

原因:所有回調共享同一變量 i,循環結束后 i 值為 5。

解決:

? 使用 let 聲明 i(塊級作用域)

? 或通過 IIFE 捕獲瞬時值:

for (var i = 0; i < 5; i++) {
(function(j) {
setTimeout(() => console.log(j)); // 輸出 0,1,2,3,4
})(i);
}

  1. 內存泄漏風險

閉包引用大對象時可能阻止垃圾回收:

function createHeavyClosure() {
const bigData = new Array(1000000);
return () => console.log(bigData[0]);
}
const leakyFunc = createHeavyClosure();
// 不再需要時手動解除引用:leakyFunc = null6


? 三、異步與事件循環

  1. setTimeout 的延遲問題

? 延遲參數為 0 仍屬異步任務,需等待同步代碼執行完畢:

setTimeout(() => console.log(“Timeout”), 0);
console.log(“Sync”); // 先輸出 “Sync”,再輸出 “Timeout”

? 事件隊列阻塞:長時間同步任務(如循環)會延遲異步回調執行,導致事件響應滯后。

  1. Promise 錯誤處理遺漏

未捕獲的 Promise 錯誤會觸發 unhandledrejection 事件:

fetch(url).then(res => res.json()); // 缺少 .catch()
// 正確做法:
fetch(url)
.then(res => res.json())
.catch(err => console.error(“請求失敗:”, err)); // 顯式捕獲3


🔍 四、this 動態綁定

this 值由調用方式決定:

const obj = {
name: “A”,
log() {
console.log(this.name); // “A”(obj 調用)
const inner = () => console.log(this.name); // “A”(箭頭函數繼承外層 this)
inner();
}
};
const fn = obj.log;
fn(); // undefined(默認綁定到全局)4,5

關鍵規則:

? 普通函數調用:this 指向全局對象(非嚴格模式)

? 方法調用:this 指向調用對象

? 箭頭函數:繼承定義時的外層 this

解決:使用 bind 顯式綁定或箭頭函數。


🔄 五、類型轉換與比較

  1. == 的隱式轉換陷阱

[] == ![] // true(![] → false → 0, [] → “” → 0)
0 == “0” // true(字符串轉數字)
null == undefined // true(特殊規則)3,5

建議:始終使用 === 避免意外轉換。

  1. typeof 與 null 的遺留問題

typeof null === “object”(歷史 Bug),判斷數組用 Array.isArray()。


?? 六、其他高頻易錯點

  1. 深淺拷貝混淆

? 直接賦值是淺拷貝(共享引用):

const a = [1, 2];
const b = a;
b.push(3); // a 變為 [1,2,3]2,5

? 深拷貝方案:JSON.parse(JSON.stringify(obj))(忽略函數/Symbol)或遞歸克隆。

  1. 浮點數精度問題

0.1 + 0.2 !== 0.3(IEEE 754 雙精度浮點限制),需用 toFixed(2) 處理顯示。

  1. 數組遍歷的坑

for…in 會遍歷原型鏈屬性且不保證順序,應使用 for 循環或 forEach:

Array.prototype.foo = 1;
const arr = [2, 3];
for (let i in arr) console.log(i); // 輸出 0, 1, “foo”(污染!)


💎 總結與應對策略

? 作用域與閉包:理解詞法作用域鏈,避免循環引用泄漏(及時解除引用)

? 異步機制:掌握事件循環(宏任務/微任務),Promise 錯誤必捕獲

? 類型安全:禁用 ==,善用可選鏈(?.)與空值合并(??)

? 代碼健壯性:使用 ESLint 靜態檢查,單元測試覆蓋邊界條件(如 null、空數組)

更多實戰案例可參考:閉包深度解析(http://www.ppmy.cn/news/1669535.html) | 異步錯誤處理指南(https://www.toutiao.com/article/7486748618485957171/) | this 綁定剖析(https://blog.csdn.net/weixin_42429220/article/details/136002209)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913638.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UNIX程序設計基本概念和術語

unix體系結構從嚴格意義上說&#xff0c;可將操作系統定義為一種軟件&#xff0c;它控制計算機硬件資源&#xff0c;提供程序運行環境。我們通常將這種軟件稱為內核&#xff08;kernel&#xff09;&#xff0c;因為它相對較小&#xff0c;而且位于環境的核心。內核的接口被稱為…

【WEB】Polar靶場 16-20題 詳細筆記

目錄 十六.簽到題 十七.簽到 十八.session文件包含 PHP 偽協議&#xff08;PHP Stream Wrappers&#xff09; base64加解密獲取源代碼 Session文件包含 namenameShell 是什么&#xff1f; 十九.Dont touch me 二十.robots robots.txt 十六.簽到題 把didino改成didiy…

數據結構*搜索樹

什么是搜索樹 搜索樹是一種樹形數據結構&#xff0c;用于高效地存儲和檢索數據。其核心特點是每個節點包含一個鍵&#xff08;Key&#xff09;&#xff0c;并遵循特定的排序規則。常見的搜索樹有二叉搜索樹、自平衡二叉樹、多叉搜索樹等。AVL樹、紅黑樹、Splay樹都屬于自平衡二…

語音交互新紀元:Hugging Face LeRobot如何讓機器人真正“懂你”

機器人之言&#xff1a;早在2024年&#xff0c;Hugging Face正式進軍真實世界機器人應用領域&#xff0c;推出了開源機器人項目LeRobot。LeRobot不僅僅是一個模型庫&#xff0c;它是一個完整的機器人學習平臺&#xff0c;融合了模仿學習、強化學習、數據可視化以及仿真環境。其…

搭建個人博客系列--MySql

前期提要&#xff1a;搭建個人博客系列--docker-CSDN博客 目前已經擁有了docker所以只需要將MySql安裝在docker上即可。 一、在docker安裝mysql docker pull mysql 二、查詢docker內的mysql鏡像 三、啟動msql docker run -d -p 33060:3306 -v /home/mysql/conf:/mysql/conf.d…

【Spring】Spring Boot + OAuth2 + JWT + Gateway的完整落地方案,包含認證流程設計

Spring Boot OAuth2 JWT Gateway的完整落地方案&#xff0c;包含認證流程設計網關在服務中的使用一、整體架構設計二、核心組件實現1. OAuth2認證服務器&#xff08;auth-service&#xff09;2. JWT自定義增強&#xff08;存儲用戶信息&#xff09;三、Gateway全局攔截&…

第一個小程序

一、前言隨著移動互聯網的發展&#xff0c;用戶對“即用即走”的輕量級應用需求日益增長&#xff0c;而傳統 App 在下載安裝、更新維護等方面存在一定的門檻。小程序應運而生&#xff0c;它是一種無需下載即可使用的應用程序形態。本文將帶你完成人生中第一個微信小程序的開發全…

【辦公類-54-07】20250901 2025學年第一學期班級點名冊模版(雙休國定假涂成灰色、修改標題和頁眉,批量導出PDF)

背景需求: 制作了校歷單后,第二個要制作的就是點名冊(灰色版) 【辦公類-54-03】20240828班級點名冊模版(雙休國定假涂成灰色)2024學年第一學期_姓名周一到周五的點名冊怎么畫-CSDN博客文章瀏覽閱讀2.1k次,點贊24次,收藏4次。【辦公類-54-03】20240828班級點名冊模版(…

iOS App首次啟動請求異常調試:一次冷啟動鏈路抓包與初始化流程修復

在一次 iOS App 大版本更新后&#xff0c;部分用戶反饋首次打開 App 時會出現“無法連接服務器”的提示&#xff0c;需要重啟 App 才能正常使用。而后續使用過程中接口調用都正常。服務器端并未記錄請求到達&#xff0c;日志中只有 sporadic&#xff08;零星&#xff09;斷連記…

【Linux網絡篇】:網絡中的其他重要協議或技術——DNS,ICMP協議,NAT技術等

?感謝您閱讀本篇文章&#xff0c;文章內容是個人學習筆記的整理&#xff0c;如果哪里有誤的話還請您指正噢? ? 個人主頁&#xff1a;余輝zmh–CSDN博客 ? 文章所屬專欄&#xff1a;Linux篇–CSDN博客 文章目錄其他重要協議或技術1.DNS2.ICMP協議3.NAT技術4.代理服務器其他重…

HarmonyOS學習4 --- 創建一個頁面

1、聲明式UI語法Entry Component struct My_page {State isLogin: boolean falsebuild() {Row() {Image(this.isLogin ? $r(app.media.icon_leon) : $r(app.media.icon)).height(60).width(60).onClick(() > {this.isLogin !this.isLogin})Text(this.isLogin ? $r(app.s…

【Java EE】Spring MVC 的使用

1. 路由映射&#xff1a;RequestMapping&#xff1a;當用戶訪問某個 URL 時&#xff0c;該注解會根據 URL 的路徑映射到具體的程序中對應的類或方法&#xff08;路由映射&#xff09;。修飾方法時&#xff0c;路徑為類路徑 方法路徑。默認情況下同時支持 GET 和 POST&#xff…

pip 安裝默認切換到國內鏡像(清華園,阿里云等)

國內Python包鏡像地址如下&#xff1a; 清華&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple/中國科技大學&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/華為云&#xff1a;https://repo.huaweiclou…

AI agent 學習

參考&#xff1a; AI搜索DeepResearch&#xff1f;_大模型 deepsearch 深度搜索-CSDN博客 Agent是以大語言模型為大腦驅動的系統&#xff0c;具備自主理解、感知、規劃、記憶和使用工具的能力&#xff0c;能夠自動化執行和完成復雜任務。 自主性和自適應&#xff0c;是判斷一款…

【PTA數據結構 | C語言版】求單鏈表list中的元素個數,即表長

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n 個整數順次插入一個初始為空的單鏈表的表頭。最后輸出單鏈表的表長。 本題旨在訓練學習者熟悉單鏈表的基本操作&#xff0c;不建議直接輸出 n。 輸入格式&#xff1a;…

玩轉Docker | 使用Docker部署HomeBox家庭庫存管理工具

玩轉Docker | 使用Docker部署HomeBox家庭庫存管理工具 前言一、HomeBox介紹Homebox簡介主要特點主要使用場景二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署HomeBox服務下載HomeBox鏡像編輯部署文件創建容器檢查容器狀態檢查服務端口安全設置四、訪問Hom…

QT中的常用控件-QWidget的enable屬性

QT中的常用控件-QWidget的enable屬性 enable描述了一個控件是否處于“可用”狀態 與之相對應的概念是“禁用”&#xff0c;禁用是該控件不能接受任何用戶的輸入事件&#xff0c;并且外觀上往往是灰色的 如果一個Widget被禁用&#xff0c;則該Widget的子元素也被禁用API說明IsEn…

【數據結構】復雜度分析

目錄 一、算法 1.基本概念 2.描述方法 3.算法效率 二、算法的時間復雜度 三、算法的空間復雜度 一、算法 1.基本概念 通俗的講&#xff0c;算法是解決問題的方法&#xff0c;比如在現實生活中一道菜譜&#xff0c;一個安裝輪椅的操作指南等。 嚴格的說&#xff0c;算法…

推薦系統基礎 --ShusenWang

學習b站up主的ShusenWang的推薦系統筆記 指標 任何系統/算法/模型都需要評估&#xff0c;對于推薦系統的指標有消費指標和北極星指標&#xff0c;消費指標是衡量用戶對產品的使用情況&#xff0c;使用頻率廣度和深度&#xff0c;用于了解用戶的使用習慣&#xff0c;北極星指標是…

linux wsl2 docker 鏡像復用快速方法

GitHub項目中的devcontainer.json、Dockerfile構建了一個A項目的鏡像環境&#xff0c;現在我有一個文件夾&#xff0c;文件夾中只有一個b.py文件&#xff0c;此時我希望使用A項目的環境&#xff0c;如何實現&#xff1f;注意&#xff1a; 建議使用下面的方法2 解決方案&#xf…