js嚴格模式和非嚴格模式

好的,這是一個非常基礎且重要的概念。我們來詳細解析一下 JavaScript 中的嚴格模式(Strict Mode)和非嚴格模式(Sloppy Mode)。

可以把它想象成參加一場考試:

  • 非嚴格模式:就像是開卷、不計時的隨堂測驗,規則很寬松,寫得不那么標準也能得分,老師會盡量“猜測”你的意圖。
  • 嚴格模式:就像是正式的閉卷大考,有嚴格的規范,任何不符合規則的寫法都會被立刻標記為錯誤,不留任何情面。

1. 什么是嚴格模式?

嚴格模式 (Strict Mode) 是在 ECMAScript 5 (ES5) 中引入的一種選擇性加入(opt-in)的機制,它為 JavaScript 代碼選擇了一種更嚴格、更受限的語法和錯誤處理規則。

它的本質是讓 JavaScript 引擎以一種更“嚴謹”的方式來解析和執行你的代碼,從而提高代碼的健壯性和安全性。

非嚴格模式 (Sloppy Mode) 則是 JavaScript 默認的、向后兼容的、更“寬容”的模式。

2. 為什么需要嚴格模式?

JavaScript 最初被設計為一門非常寬容的語言,為了讓網頁在各種意外情況下都能勉強運行(而不是直接崩潰)。但這種寬容性也導致了一些問題:

  • 靜默錯誤 (Silent Errors):一些本該是錯誤的操作,在非嚴格模式下不會報錯,只會靜默失敗,這使得調試變得異常困難。
  • 不安全的行為: 某些語法可能存在安全隱患或導致意外的全局變量污染。
  • 阻礙引擎優化: 一些“壞語法”讓 JavaScript 引擎難以對代碼進行性能優化。
  • 為未來做準備: 禁止一些未來可能被用作新關鍵字的保留字。

嚴格模式的誕生就是為了解決這些歷史遺留問題。

3. 如何開啟嚴格模式?

開啟嚴格模式非常簡單,只需在代碼的特定位置添加一個字符串字面量:

"use strict";

根據你放置的位置,它的作用域也不同:

  • 全局嚴格模式: 將 "use strict"; 放在腳本文件的最頂部

    // my-script.js
    "use strict";// 整個文件都將以嚴格模式運行
    let x = 10;
    // ...
    
  • 函數內嚴格模式: 將 "use strict"; 放在函數體的最頂部

    function myStrictFunction() {"use strict";// 只有這個函數內部是以嚴格模式運行的let y = 20;// ...
    }
    

一個非常重要的現代知識點:

ES6 模塊 (import/export)class 的代碼塊中,嚴格模式是默認開啟的,你無需手動添加 "use strict";。這就是為什么在現代前端框架(如 React, Vue)的開發中,你很少看到這行代碼,因為你寫的代碼基本上都已經是運行在嚴格模式下的模塊了。


4. 嚴格模式與非嚴格模式的主要區別

下面是一些最直觀和重要的區別,通過代碼對比會非常清晰:

a. 禁止意外創建全局變量

這是最經典的區別。

  • 非嚴格模式:
    function createGlobal() {mistake = "I am a global variable!"; // 忘記寫 let/const/var
    }
    createGlobal();
    console.log(window.mistake); // "I am a global variable!" (在瀏覽器中)
    // 變量泄漏到了全局作用域,這是一個非常危險的副作用。
    
  • 嚴格模式:
    "use strict";
    function createGlobal() {mistake = "This will cause an error";
    }
    // createGlobal(); // 這一行會直接拋出 ReferenceError,程序會中斷
    
    結論:嚴格模式將一個常見的“靜默錯誤”變成了“拋出錯誤”,讓你能立刻發現問題。
b. 禁止對只讀屬性或不可擴展對象進行修改
  • 非嚴格模式:
    const obj = {};
    Object.defineProperty(obj, 'readOnly', { value: 10, writable: false });obj.readOnly = 20; // 嘗試修改只讀屬性
    console.log(obj.readOnly); // 10 (修改靜默失敗,不會報錯)
    
  • 嚴格模式:
    "use strict";
    const obj = {};
    Object.defineProperty(obj, 'readOnly', { value: 10, writable: false });// obj.readOnly = 20; // 這一行會拋出 TypeError
    
    結論: 嚴格模式同樣將靜默失敗的操作變成了明確的錯誤。
c. this 的指向不同

我們在之前的練習中已經遇到過。

  • 非嚴格模式:
    function showThis() {console.log(this);
    }
    showThis(); // 在瀏覽器中,會輸出全局的 window 對象
    
  • 嚴格模式:
    "use strict";
    function showThis() {console.log(this);
    }
    showThis(); // 輸出 undefined
    
    結論: 嚴格模式下的 this 行為更安全,避免了意外地污染全局對象。
d. 禁止重復的參數名
  • 非嚴格模式:
    function sum(a, a, b) { // 不會報錯return a + a + b; // 實際上是第二個 a 生效
    }
    console.log(sum(1, 2, 3)); // 2 + 2 + 3 = 7
    
  • 嚴格模式:
    "use strict";
    // function sum(a, a, b) { // 這一行在代碼解析階段就會拋出 SyntaxError
    //   return a + b;
    // }
    
    結論: 嚴格模式在語法層面就杜絕了這種不合理的代碼。

總結與建議

特性非嚴格模式 (Sloppy Mode)嚴格模式 (Strict Mode)
意外全局變量允許,靜默創建禁止,拋出 ReferenceError
修改只讀屬性靜默失敗禁止,拋出 TypeError
全局函數this指向全局對象 (window)undefined
重復參數名允許(最后一個生效)禁止,拋出 SyntaxError

最終建議:始終使用嚴格模式!

在今天,你沒有任何理由不使用嚴格模式。它能幫你寫出更健壯、更安全、更規范的代碼,并且能讓你避免很多難以調試的“幽靈bug”。

鑒于現代 JavaScript 的模塊和類已經默認開啟了嚴格模式,將 "use strict"; 放在所有非模塊化的老腳本的頂部,應該成為你的一個標準習慣。

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

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

相關文章

板凳-------Mysql cookbook學習 (十一--------1)

第11章:生成和使用序列 11.0 引言 11.1 創建一個序列列并生成序列值 CREATE TABLE insect ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id),name VARCHAR(30) NOT NULL,date DATE NOT NULL,origin VARCHAR(30) NOT NULL); 字段說明 ?id…

Vue3 中 Excel 導出的性能優化與實戰指南

文章目錄 Vue3 中 Excel 導出的性能優化與實戰指南引言:為什么你的導出功能會卡死瀏覽器?一、前端導出方案深度剖析1.1 xlsx (SheetJS) - 輕量級冠軍1.2 exceljs - 功能強大的重量級選手 二、后端導出方案:大數據處理的救星2.1 為什么大數據需…

安卓RecyclerView實現3D滑動輪播效果全流程實戰

安卓RecyclerView實現3D滑動輪播效果全流程實戰 1. 前言 作為一名學習安卓的人,在接觸之前和之后兩種完全不同的想法: 好看和怎么實現 當初接觸到RecyclerView就覺得這個控件就可以把關于列表的所有UI實現,即便不能,也是功能十分強大 放在現在依然是應用最廣的滑動列表控…

電機控制——電機位置傳感器零位標定

在有感FOC算法中電機位置是一個重要的輸入,電機位置傳感器的作用就是測量電機的旋轉角度,通常是輸出sin(Theta)和cos(Theta)兩路模擬信號,根據這兩路模擬信號測得電機旋轉絕對角度。注意傳感器測量的是機械角度,不是電角度。 關于…

生物化學(實驗流程) PCR聚合酶鏈式反應: DNA 凝膠電泳實驗原理 實驗流程方法 實操建議筆記

凝膠電泳是分子生物學中最常用的技術之一,廣泛用于 DNA 片段的可視化、分離與識別。在獲取DNA 凝膠電泳相關設備(電泳設備 & DNA樣品染料 & 凝膠 & 染料)之后,可以考慮進行電泳操作。 整體電泳操作流程(從…

Python應用指南:利用高德地圖API獲取公交+地鐵可達圈(三)

副標題:基于模型構建器的批處理多份CSV轉換為點、線、面圖層 在地理信息系統(GIS)的實際應用中,我們經常需要處理大量以表格形式存儲的數據,例如人口統計數據、興趣點(POI)信息和監測站點記錄等…

每日算法刷題Day38 6.25:leetcode前綴和3道題,用時1h40min

5. 1749.任意子數組和的絕對值的最大值(中等,學習) 1749. 任意子數組和的絕對值的最大值 - 力扣(LeetCode) 思想 1.給你一個整數數組 nums 。一個子數組 [numsl, numsl1, ..., numsr-1, numsr] 的 和的絕對值 為 abs(numsl numsl1 ... numsr-1 nu…

創客匠人視角下創始人 IP 打造的底層邏輯與實踐路徑

在知識付費行業蓬勃發展的當下,創始人 IP 已成為連接用戶與商業價值的核心紐帶。創客匠人創始人老蔣在與行業頭部 IP 洪鑫的對話中揭示了一個關鍵命題:IP 打造的成敗,始于發心與理念的根基。從洪鑫教育中心營收超 6000 萬的案例來看&#xff…

2022/7 N2 jlpt詞匯

気力(きりょく) 清く(きよく) 記録(きろく) 記憶(きおく) 賢い(かしこい) 偉い(えらい) 凄い(すごい) 鋭い&am…

系統性能優化-8 TCP緩沖區與擁塞控制

每個 TCP 連接都有發送緩沖區和接收緩沖區,發送緩沖區存已發送未確認數據和待發送數據,接收緩沖區存接收但是沒有被上層服務讀取的數據。 # cat /proc/net/sockstat sockets: used 1885 TCP: inuse 537 orphan 0 tw 3 alloc 959 mem 10其中 mem 代表當前…

【前端】vue工程環境配置

環境準備(Windows版本) nodejs安裝 (base) PS C:\Users\Administrator> nvm install 18.8.0 (base) PS C:\Users\Administrator> nvm use 18.8.0 Now using node v18.8.0 (64-bit) (base) PS C:\Users\Administrator> npm -v 8.18.0 (base) PS C:\Users\Administrat…

什么是data version control?為什么需要它?它能解決什么問題?

Data Version Control (DVC) 是一個開源工具,專為數據科學和機器學習項目設計。它的核心目標是像 Git 管理代碼一樣來管理機器學習項目中的數據和模型文件。 簡單來說,DVC 是什么? Git for Data & Models: 它擴展了 Git 的功…

簡約計生用品商城簡介

計生用品商城簡介:uniapp結合thinkphp實現的全開源代碼, 內置基本功能:1.后臺商品excel一鍵導入 2.分銷利潤,按照利潤加個分紅

go中自動補全插件安裝-gopls

vscode中安裝gopls失敗,導致go中代碼無提示,無法自動補全引用 環境變量中設置go的代理:setx GOPROXY “https://goproxy.cn,direct”go install golang.org/x/tools/goplslatest

力扣尋找數組中心索引-性能優化思考

如下代碼 var pivotIndex function(nums) {// 空數組返回-1if (nums.length 0) return -1// 計算數組總和const totalSum nums.reduce((sum, num) > sum num, 0);let leftSum 0;// 遍歷數組查找中心索引for (let i 0; i < nums.length; i) {// 右側和 總和 - 左側…

SVN 分支管理(本文以Unity項目為例)

文章目錄 1.準備工作2.新建SVN倉庫2.拉取遠端空 trunk 到Unity項目目錄下3.設置忽略&#xff0c;提交unity項目至倉庫3.創建分支4.切換分支5.合并分支回主干&#xff08;例如將 trunk_01 合并回 trunk&#xff09;5.刪除分支&#xff08;可選&#xff09; 1.準備工作 下載Tort…

數據結構學習day6---流+讀寫函數+緩沖+定義函數

目錄 1.標準io&#xff1b; stdio.h 1.1標準io的概念 1.2Linux操作系統當中IO都是對文件的操作 1.3標準IO&#xff1a;ANSI C 設計的一組用文件IO 封裝的操作庫函數 2.文件 2.1作用 2.2linux中文件的類型 3.man 5.流: FILE* 5.1流的定義 5.2流的分類 6.c語言文…

互聯網醫院,正在發生的醫療新變革

隨著信息技術的飛速發展&#xff0c;互聯網醫院作為醫療服務的新形態&#xff0c;正在全球范圍內迅速崛起。在中國&#xff0c;這一變革尤為顯著&#xff0c;互聯網醫院不僅改善了醫療服務的可及性和便捷性&#xff0c;還極大地提升了醫療服務的質量和效率。 一、互聯網醫院的發…

rabbitmq動態創建交換機、隊列、動態綁定,銷毀

// 緩存已創建的綁定&#xff0c;避免重復聲明private final Map<String, Date> createdBindings new ConcurrentHashMap<>(); public void createAndBindQueueToExchange(String type,String clinetId, String routingKey) {String queueName routingKey;lo…

云效代碼倉庫導入自建gitlab中

登錄自建GitLab 在瀏覽器中輸入GitLab訪問地址http://192.168.1.111:81/users/sign_in&#xff0c;輸入賬號和密碼登錄GitLab服務&#xff0c;如下圖&#xff1a; 新建一個空的代碼庫 按照以下截圖順序&#xff0c;創建一個新的空項目&#xff0c;如下&#xff1a; 克隆鏡像 …