JavaScript核心概念全解析

目錄

1. 作用域

(1) 局部作用域

(2) 全局作用域

2. 垃圾回收

(1) 引用計數法

(2) 標記清除法

3. 閉包

(1) 作用

(2) 風險

4. 變量提升

(1)?var

(2)?let?和?const

(3)?const

5. 函數提升

(1) 函數聲明

(2) 函數表達式

6. 函數參數

(1) 動態參數

(2) 剩余參數

(3) 展開運算符

7. 必須加分號的兩種情況

(1) 立即執行函數

(2) 使用數組的時候

8. 箭頭函數

(1) 特點

9. Symbol

10. 生成器函數

11. Promise

12.?async?和?await

(1)?async

(2)?await


1. 作用域

作用域是指變量和函數的可訪問范圍。

(1) 局部作用域
  • 函數作用域:在函數內部聲明的變量,外部無法訪問。

    javascript

    function foo() {var x = 10; // 函數作用域
    }
    console.log(x); // 報錯:x未定義
  • 塊作用域:在大括號?{}?內部聲明的變量。
    • var?聲明的變量不會產生塊作用域。
    • let?和?const?聲明的變量會產生塊作用域。

    javascript

    if (true) {let y = 20; // 塊作用域
    }
    console.log(y); // 報錯:y未定義
(2) 全局作用域
  • 最外層聲明的變量,在任何地方都可以訪問。

    javascript

    var z = 30; // 全局作用域
    function bar() {console.log(z); // 30
    }

2. 垃圾回收

垃圾回收是指自動管理內存的機制,釋放不再使用的內存。

(1) 引用計數法
  • 已棄用。
  • 通過記錄對象被引用的次數來判斷是否回收。
  • 缺點:無法處理循環引用(兩個對象相互引用),導致內存泄漏。
(2) 標記清除法
  • 從全局對象(根部)開始掃描,標記所有可達的對象。
  • 未標記的對象會被回收。
  • 解決了循環引用的問題。

3. 閉包

閉包是指一個函數及其對周圍狀態的引用捆綁在一起。

(1) 作用
  • 外部訪問函數內部變量,實現數據私有。

    javascript

    function outer() {let count = 0;return function inner() {count++;return count;};
    }
    const fn = outer();
    console.log(fn()); // 1
    console.log(fn()); // 2
(2) 風險
  • 閉包會導致內存泄漏,因為內部函數會保留對外部函數變量的引用。

4. 變量提升

變量提升是指將變量聲明提升到當前作用域的最前面。

(1)?var
  • 函數作用域。
  • 變量提升。
  • 可以重復聲明。

    javascript

    console.log(a); // undefined
    var a = 10;
(2)?let?和?const
  • 塊級作用域。
  • 沒有變量提升。
  • 作用域內只能聲明一次。

    javascript

    console.log(b); // 報錯:b未定義
    let b = 20;
(3)?const
  • 塊級作用域。
  • 必須賦初始值。
  • 不能重新賦值,但可以修改數組或對象的元素。

    javascript

    const arr = [1, 2, 3];
    arr.push(4); // 允許
    arr = []; // 報錯

5. 函數提升

函數聲明會被提升到當前作用域的最前面。

(1) 函數聲明
  • 提升函數聲明,但不提升調用。

    javascript

    foo(); // "Hello"
    function foo() {console.log("Hello");
    }
(2) 函數表達式
  • 必須先聲明賦值才能調用。

    javascript

    bar(); // 報錯:bar未定義
    var bar = function() {console.log("World");
    };

6. 函數參數

(1) 動態參數
  • 使用?arguments?對象(偽數組)。

    javascript

    function sum() {let total = 0;for (let i = 0; i < arguments.length; i++) {total += arguments[i];}return total;
    }
    console.log(sum(1, 2, 3)); // 6
(2) 剩余參數
  • 使用?...?獲取多余實參(真數組)。

    javascript

    function sum(...nums) {return nums.reduce((a, b) => a + b);
    }
    console.log(sum(1, 2, 3)); // 6
(3) 展開運算符
  • 展開數組,不會修改原數組。

    javascript

    const arr1 = [1, 2];
    const arr2 = [3, 4];
    const merged = [...arr1, ...arr2]; // [1, 2, 3, 4]

7. 必須加分號的兩種情況

(1) 立即執行函數

javascript

(function() {console.log("IIFE");
})();
(2) 使用數組的時候

javascript

const arr = [1, 2, 3];
[].push.apply(arr, [4, 5]);

8. 箭頭函數

(1) 特點
  • this?是靜態的,指向聲明時的作用域。
  • 不能作為構造函數實例化對象。
  • 不能使用?arguments?對象。

    javascript

    const add = (a, b) => a + b;
    console.log(add(1, 2)); // 3

9. Symbol

  • 類似字符串的第七種基本數據類型。
  • 值是唯一的。
  • 不能與其他數據進行運算。
  • 不能遍歷。

    javascript

    const id = Symbol("id");
    const obj = {[id]: 123
    };
    console.log(obj[id]); // 123

10. 生成器函數

  • 用于異步編程。

    javascript

    function* generator() {yield 1;yield 2;
    }
    const gen = generator();
    console.log(gen.next().value); // 1

11. Promise

  • 封裝異步操作并獲取成功或失敗的結果。

    javascript

    const promise = new Promise((resolve, reject) => {setTimeout(() => resolve("Success"), 1000);
    });
    promise.then((result) => console.log(result)); // "Success"

12.?async?和?await

(1)?async
  • 返回一個 Promise 對象。

    javascript

    async function foo() {return "Hello";
    }
    foo().then((result) => console.log(result)); // "Hello"
(2)?await
  • 必須寫在?async?函數中。
  • 等待 Promise 完成并返回結果。

    javascript

    async function bar() {const result = await Promise.resolve("World");console.log(result); // "World"
    }
    bar();

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

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

相關文章

力扣刷題(第一百天)

靈感來源 - 保持更新&#xff0c;努力學習- python腳本學習提莫攻擊解題思路初始化總中毒時間 total。遍歷每次攻擊的時間點&#xff08;從第二個開始&#xff09;&#xff1a;計算當前攻擊與前一次攻擊的時間間隔 gap。若 gap < duration&#xff0c;則本次中毒時間為 gap&…

JMeter 性能測試實戰筆記

JMeter 性能測試實戰筆記 本文檔是一份詳細的 JMeter 指南&#xff0c;涵蓋了從創建測試計劃、執行測試到解讀性能結果的全過程。 一、創建測試計劃 一個完整的測試計劃是執行性能測試的基礎。下面將分步介紹如何創建一個針對文件上傳接口的測試場景。 第一步&#xff1a;添加線…

圖像處理:第二篇 —— 選擇鏡頭的基礎知識及對圖像處理的影響

一、圖像傳感器的典型應用圖像處理過程大致可分為如下四步&#xff1a;1.拍 攝 按下快門&#xff0c;拍攝圖像2.傳 送 將圖像數據由照相機傳送到控制器。3.處 理 前處理 : 對于圖像數據進行加工&#xff0c;使其特征更加明顯。測算處理 : 根據圖像數據對于損…

Linux 系統文件夾結構及用途說明

Linux 系統采用樹形文件結構&#xff0c;每個目錄都有明確的功能定位&#xff0c;遵循 FHS&#xff08;Filesystem Hierarchy Standard&#xff09; 標準。以下是新安裝系統后主要文件夾的用途&#xff1a;一、根目錄&#xff08;/&#xff09;核心文件夾1. /bin&#xff1a;基…

[spring6: HttpSecurity]-全新寫法

HttpSecurity HttpSecurity 是 Spring Security 中用于配置基于 HTTP 請求的安全策略的核心構建器&#xff0c;支持細粒度控制請求授權、認證、登錄、登出、CSRF、CORS、會話管理等安全功能。 package xyz.idoly.demo;import org.springframework.context.annotation.Bean; imp…

MIPI DSI 轉 1LVDS ,分辨率1920*1080.

一款橋接芯片&#xff0c;它接收 MP DSI 輸入并發送 LVDS 輸出。MlPI DSI 支持至多 4 條通道&#xff0c;每條通道的最大傳輸速率為 1Gbps&#xff0c;總的最大輸入帶寬為 4Gbps&#xff0c;并且還支持 MlPI 定義的 ULPS&#xff08;超低功耗狀態&#xff09;。LVDS 輸出采用 V…

墨者:SQL手工注入漏洞測試(MySQL數據庫)

一、SQL手工注入漏洞測試(MySQL數據庫) 本文以墨者學院靶場為例&#xff0c;演示MySQL數據庫的手工SQL注入全過程。靶場以自己的地址為準&#xff1a;http://124.70.64.48:47777/new_list.php?id1 二、注入原理與流程&#xff08;如下指令去掉了id之前的內容&#xff09; M…

idea打開后project窗口未顯示項目名稱的解決方案

前言 今天上班后&#xff0c;打開了idea發現之前project窗口中的項目都不見了&#xff0c;啥也沒有&#xff0c;見下圖原因 一般為配置文件*.iml 出錯了。 解決方案1 方法1&#xff1a;若知道出錯的具體位置與原因&#xff0c;用文本編輯器打開*.iml文件&#xff0c;找到出錯位…

不一樣的Mysql安裝方式

文章目錄MySQL介紹與安裝MySQL介紹基本安裝下載打開網址點擊點擊選擇LTSwindows選擇zip壓縮包格式&#xff0c;mac OS選擇dmg格式。不需要注冊登陸網站&#xff0c;直接謝謝&#xff0c;繼續下載即可。解壓復制bin路徑配置環境變量搜索點擊環境變量點擊用戶變量的Path 或 系統變…

MyBatis高級應用實戰指南

MyBatis高級應用實例 以下是MyBatis高級應用實例,涵蓋復雜查詢、動態SQL、插件開發、緩存優化等場景,幫助深入掌握MyBatis核心技術。 動態SQL構建 Example 1: 多條件動態查詢 使用<if>和<where>標簽實現條件組合: <select id="findUsers" resu…

Xilinx-FPGA-PCIe-XDMA 驅動內核兼容性問題修復方案

問題1&#xff1a;implicit declaration of function "mmiowb()"解決方法&#xff1a;在 libxdma.c 和 cdev_xvc.c 文件中注釋掉所有 mmiowb () 函數調用問題2&#xff1a; "macro"access_ok"passed 3 arguments, but takes just 2"解決方法&…

ThreadLocal--ThreadLocal介紹

&#x1f9e0; 一、什么是 ThreadLocal&#xff1f; ThreadLocal 是 Java 提供的一種 線程本地變量機制&#xff1b; 每個線程都維護一份自己的副本&#xff1b; 它不用于多個線程共享變量&#xff0c;而是用于每個線程獨立維護自己的變量副本&#xff1b; 常用于&#xff1…

AWS云S3+Glue+EMRonEC2+ReadShift

Amazon S3&#xff08;Amazon Simple Storage Service&#xff09;即亞馬遜簡單存儲服務&#xff0c;是 AWS&#xff08;Amazon Web Services&#xff09;提供的一種對象存儲服務&#xff0c;在大數據領域被廣泛使用。以下是關于它的詳細介紹&#xff1a;基本概念Amazon S3 主要…

OpenLayers 綜合案例-軌跡回放

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

語音自動生成PPT、思維導圖、會議紀要、筆記、大綱、導讀等

一、需要用到錄音工具&#xff0c;手機端工具&#xff1a;訊飛聽見二、需要用到的工具通義&#xff1a;https://www.tongyi.com/discover上傳錄音&#xff0c;描述一下&#xff0c;讓直接給生成PPT就行&#xff0c;點生成就可以生成ppt&#xff0c;對PPT進行導出就行 三、除了生…

【MySQL】腳本化快速搭建跨平臺、可定制的MySQL數據庫

冗長的廢話就省略了&#xff0c;大家看到這篇博客&#xff0c;效果如標題所示&#xff0c;我將提供完整的腳本&#xff0c;并用 「保姆級」的詳細步驟&#xff0c;給你提供一個快速搭建跨平臺、可定制的 MySQL環境的解決方案。保證無論你是 Linux 服務器管理員、macOS 開發者&a…

MAC包頭、IP包頭 、UDP包頭中的長度含義是啥?三者之間有啥區別?

以太網幀、IP包及TCP與UDP的報文格式 下面用通俗技術的方式詳細解釋&#xff1a; 1. MAC包頭&#xff08;以太網幀頭&#xff09;中的長度 字段名稱&#xff1a;EtherType/Length位置&#xff1a;以太網幀頭的第13、14字節含義&#xff1a; 如果值小于等于1500&#xff08;0x0…

Multiscale Structure Guided Diffusion for Image Deblurring 論文閱讀

基于多尺度結構引導擴散模型的圖像去模糊 摘要 擴散概率模型&#xff08;Diffusion Probabilistic Models, DPMs&#xff09;最近被用于圖像去模糊&#xff0c;其被表述為一個以模糊輸入為條件的圖像條件生成過程&#xff0c;將高斯噪聲映射到高質量圖像。當在成對的域內數據上…

git 提交時排除一個或多個文件

前言 在提交文件時&#xff0c;總是有一些文件是不需要提交的&#xff0c;比如機器上的配置文件&#xff0c;日志文件等等&#xff0c;所以在提交時就需要排除這些文件&#xff1b; 第一種方案 git add file1 file2 比如我新添加了3個文件&#xff1a; file1.txt file2.txt fil…

OpenCV 入門:基礎圖像操作

在計算機視覺領域&#xff0c;OpenCV 無疑是最受歡迎的開源庫之一。它由 Intel 公司俄羅斯團隊發起&#xff0c;如今已成為處理圖像和視頻的強大工具。本文我會介紹OpenCV 的基礎知識&#xff0c;從圖像的讀寫顯示到實時視頻流處理&#xff0c;邁出計算機視覺的第一步。 目錄 …