js-day10

JS學習之旅-day10

  • 1. 作用域
    • 1.1 局部作用域
    • 1.2 全局作用域
    • 1.3 作用域鏈
    • 1.4 JS垃圾回收機制(GC)
    • 1.5 閉包
    • 1.6 變量提升
  • 2. 函數進階
    • 2.1 函數提升
    • 2.2 函數參數
    • 2.3 箭頭函數
  • 3. 解構賦值
    • 3.1 數組解構
    • 3.2 對象解構
  • 4. 數組遍歷
    • 4.1 forEach
    • 4.2 filter

1. 作用域

作用域規定了變量能夠訪問的“范圍”,分為:局部作用域、全局作用域

1.1 局部作用域

  1. 函數作用域:只能在函數內部訪問,外部無法直接訪問,函數執行完后,函數內部的變量會被清空。
  2. 塊作用域:被 {} 包裹的,使用let、const聲明的變量會產生塊作用域,var不會產生塊作用域

1.2 全局作用域

  1. 寫在最外層:

1.3 作用域鏈

  1. 本質:底層的變量查找機制
  2. 變量查找機制:
    1. 在函數被執行時,會優先在當前函數作用域中查找變量
    2. 如果當前作用域查找不到,則會依次逐級查找父級作用域 直到全局作用域
  3. 總結:
    1. 嵌套關系的作用域串聯起來形成了作用域鏈
    2. 相同作用域中按著從小到大的規則查找變量
    3. 子作用域可以訪問父作用域,父作用域無法訪問子作用域

1.4 JS垃圾回收機制(GC)

  1. JS中內存的分配和回收都是自動完成的,內存在不使用的時候會被垃圾回收器自動回收。
  2. 內存的生命周期:
    1. 內存分配:當我們聲明變量、函數、對象的時候,系統會自動為他們分配內存
    2. 內存使用:即讀寫內存,也就是使用變量、函數等
    3. 內存回收:使用完畢,由垃圾回收器自動回收不再使用的內存
  3. 說明:
    1. 全局變量一般不會回收(關閉頁面回收)
    2. 局部變量不被使用了,會被自動回收掉
  4. 內存泄露:程序中分配的內存由于某種原因程序未釋放無法釋放叫做內存泄露
  5. 算法說明:
    1. 堆棧空間分配區別:
      1. 棧:由操作系統自動分配釋放函數的參數值、局部變量等,基本數據類型都放在棧里
      2. 堆:一般由程序員分配釋放,若程序員不釋放,由垃圾回收機制回收。復雜數據類型放在堆里
    2. 垃圾回收機制兩種常見的算法:引用計數法標記清除法
      1. 引用計數(不再使用)
        1. 嵌套引用(循環引用):如果兩個對象相互引用,盡管他們不再使用,但垃圾回收器不會進行回收,導致內存泄露
          function fn(){let o1 = {}let 02 = {}o1.a=o2o2.a=o1return ‘引用計數無法回收’
          }
          
      2. 標記清除法:從根部掃描對象,能查找到的就是使用的,查找不到的就是要回收的

1.5 閉包

  1. 概念:一個函數對周圍狀態的引用捆綁在一起,內部函數中訪問到其他外層函數的作用域

  2. 閉包 = 內層函數 + 外層函數的變量

    function outer(){const a=1function f(){console.log(a)}f()
    }
    outer()
    
  3. 閉包的作用:封裝數據,提供操作,外部也可以訪問函數內部的變量

    function outer() {const a = 1;function fn() {console.log(a);}return fn
    }
    const fn = outer()
    fn()
    
  4. 風險:內存泄露

1.6 變量提升

  1. 把所有var聲明的變量提升到當前作用域前面;let/const 不存在變量提升
  2. 只提升聲明,不提升賦值
  3. 變量提升出現在相同作用域中

2. 函數進階

2.1 函數提升

  1. 會把所有函數聲明提升到當前作用域的最前面
  2. 只提升函數聲明,不提升函數調用。(函數表達式不存在提升的現象)
    //函數提升
    foo()
    function foo(){	console.log('提升了')
    }//函數表達式不存在提升
    bar()
    var bar=function(){console.log('報錯了')
    }
    

2.2 函數參數

  1. 動態參數:arguments 是函數內部內置的偽數組變量,它包含了調用函數時傳入的所有實參
    function sum() {// arguments 動態參數 只存在函數中// arguments 是一個偽數組, 它不是一個真正的數組, 但是它有length屬性, 可以通過下標訪問元素// console.log(arguments);let total = 0;for (let i = 0; i < arguments.length; i++) {total += arguments[i];}console.log(total);
    }
    sum(1, 2);
    sum(1, 2, 3);
    sum(1, 2, 3, 4);
    sum(1, 2, 3, 4, 5);
    
  2. 剩余參數:允許我們將一個不定數量的參數表示為一個數組
    1. ...是語法符號,之余最末函數形參之前,用于獲取多余的實參
    2. 借助...獲取的剩余實參,是一個真數組
    function sum(a,...other) {console.log(other);
    }
    sum(1, 2); // [2]
    sum(1, 2, 3); // [2,3]
    sum(1, 2, 3, 4); // [2,3,4]
    sum(1, 2, 3, 4, 5); // [2,3,4,5]
    
  3. 展開運算符 ...
    1. 可以將一個數組展開
      const arr=[1,2,3]
      console.log(...arr) //1 2 3
      
    2. 說明
      1. 不會修改原數組
      2. 最典型的應用:求數組的最值、合并數組
    const arr = [1, 2, 3, 4, 5];console.log(...arr);// 求數組最大值
    console.log(Math.max(...arr));// 合并數組
    const arr2 = [6, 7, 8, 9, 10];
    const arr3 = [...arr, ...arr2];
    

2.3 箭頭函數

  1. 目的:更簡潔的函數寫法并且不綁定this,適用于那些需要匿名函數的地方
  2. 基本語法
    // 只有一行代碼時, 可以省略大括號,return 會自動返回
    const fn = (a, b) => a + b;
    console.log(fn(1, 2));// 只有一個形參時, 可以省略小括號
    const fn2 = a => a + 1;
    console.log(fn2(1));// 直接返回一個對象
    const fn3 = (uname) => ({ uname: uname });
    console.log(fn3("張三"))
    
  3. 參數
    1. 箭頭函數沒有arguments參數,但是有剩余參數
    2. 箭頭函數不會創建自己的this,它會從自己的作用域鏈的上一層沿用this

3. 解構賦值

3.1 數組解構

  1. 定義:將數組的單元值快速批量賦值給一系列的變量。
  2. 語法:const [a,b,c] = [100,60,80]
  3. 代碼案例:交換變量
    let x = 1;
    let y = 2;
    [x, y] = [y, x];  
    console.log(x, y);
    

3.2 對象解構

  1. 語法:const { name, age } = { name: 'John', age: 20 };
  2. 注意:變量名和屬性名一定要相同
  3. 解構的變量名可以重新命名:const { name: name1, age: age1 } = { name: 'John', age: 20 };
  4. 數組對象解構:
    // 數組對象解構
    const pig = [{ name: 'John', age: 20 },
    ]
    const [{ name: name2, age: age2 }] = pig;
    
  5. 多級對象解構
    // 多級對象解構
    const person = {uname: 'John',uage: 20,address: {city: 'New York',
    }}
    const { uname, uage, address: { city } } = person;
    

4. 數組遍歷

4.1 forEach

  1. 代碼:
    被遍歷的數組.forEach(function(當前數組元素,當前元素索引號){//函數體
    })
    
  2. 注意:
    1. forEach主要是遍歷數組
    2. 當前數組元素是必須寫的,索引號可以省略
    3. 與map的區別:map有返回,forEach沒有

4.2 filter

  1. 篩選數組符合條件的元素,并返回篩選之后元素的新數組
  2. 代碼:
    被遍歷的數組.filter(function(當前數組元素,當前元素索引號){return 篩選條件
    })
    

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

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

相關文章

智能數字式毫秒計在實際生活場景中的應用

在電力領域&#xff0c;SYN5307型數字毫秒表可精準監測特高壓變電站斷路器合閘時間差&#xff0c;定位繼電保護裝置信號延遲&#xff1b;工業自動化中&#xff0c;優化汽車焊裝線時序、提升半導體晶圓切割良率&#xff1b;科研計量上&#xff0c;助力量子通信同步校準&#xff…

Java面試基礎:概念

1. Java的特點跨平臺性&#xff1a;Java的 “編寫一次&#xff0c;運行無處不在” 是其最大的特點之一。Java編譯器將源代碼編譯成字節碼(bytecode)&#xff0c;該字節碼可以在任何安裝了Java虛擬機(JVM)的系統上運行。面向對象&#xff1a;Java是一門嚴格的面向對象編程語言&a…

PyQt5高級窗口控件詳解:停靠窗口、多文檔界面與滾動條

掌握PyQt5的高級窗口控件&#xff0c;讓你的GUI應用具備專業級的布局與交互體驗 在PyQt5應用開發中&#xff0c;高效管理窗口布局和實現復雜交互功能是提升用戶體驗的關鍵。本文將深入解析三個核心高級控件&#xff1a;停靠窗口&#xff08;QDockWidget&#xff09;、多文檔界面…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DrawingApp(畫板組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DrawingApp組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup>…

Eureka、Nacos、LoadBalance、OpenFeign?之間的區別聯系和協作 (附代碼講解)

這篇文章聊聊微服務里的這幾個老伙計&#xff1a;Eureka、Nacos、LoadBalance、OpenFeign。咱們做微服務開發&#xff0c;總會跟這幾個組件打交道&#xff1a;Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它們各司其職又互相配合&#xff0c;今天就把它們的關系、用…

JavaSE-繼承

繼承&#xff08;inheritance&#xff09;繼承的意義我們首先來看下面兩個類&#xff1a;public class Dog {public String name;public int age;public void eat(){System.out.println(this.name"正在吃飯");}public void bark(){System.out.println(this.name"…

第二屆虛擬現實、圖像和信號處理國際學術會議(VRISP 2025)

重要信息 官網&#xff1a;www.icvisp.net 時間&#xff1a;2025年8月1-3日 地點&#xff1a;中國-長沙 簡介 近年來&#xff0c;虛擬現實技術取得了顯著進步&#xff0c;與5G、云計算和物聯網等新一代信息技術的融合加速&#xff0c;推動了其在硬件、軟件和內容應用等方面…

SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分離版:整體布局、架構調整(二)

目錄 一、前言 二、后端調整 1.實體類調整 2.菜單相關接口 3.用戶相關接口 4.新增工具類 5.新增菜單樹返回類 6.配置類、攔截器 三、前端調整 1.請求調整 2.頁面布局、樣式調整 1.user.vue 2.index.vue 3.請求攔截 四、開發過程中的問題 五、附&#xff1a…

vue3官方文檔學習心得

這幾天抽空把vue3的文檔整個看了一遍。簡介 | Vue.js 23年寫過一個vue2的項目&#xff0c;24年寫了一個vue3的項目&#xff0c;頁面功能比較簡單&#xff0c;用幾個簡單的API&#xff0c;watch、watchEffect、ref、reactive就能實現的業務功能。 寫了幾年的react的&#xff0…

Pycharm恢復默認設置,配置導致復制粘貼等不能使用

在file 種找到manage IDE settings在manage IDE settings中找到restore default settings

【王樹森推薦系統】召回12:曝光過濾 Bloom Filter

概述 曝光過濾通常是在召回階段做&#xff0c;具體的方法就是用 Bloom Filter 曝光過濾問題 如果用戶看過某個物品&#xff0c;則不再把該物品曝光給用戶。原因是同一個物品重復曝光給用戶會損害用戶體驗&#xff0c;但也不是所有推薦系統都有曝光過濾&#xff0c;像 youtube 這…

基于STM32單片機的心率血氧監測系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)

系列文章目錄 文章目錄 系列文章目錄前言1 資料獲取與演示視頻1.1 資料介紹1.2 資料獲取1.3 演示視頻 2 系統框架3 硬件3.1 主控制器3.2 顯示屏3.3 WIFI模塊3.4心率血氧傳感器 4 設計PCB4.1 安裝下載立創EDA專業版4.2 畫原理圖4.4 使用嘉立創下單助手進行下單&#xff0c;打板。…

main(int argc,char **agrv)的含義

今天和大家討論一個常見的但是不容易深入了解的知識點。那就是 main 函數聲明中使用到的 argc 和 argv 的含義。通常我們寫主函數的時候一般都是直接使用int main() 或者 void main() 來聲明 main 函數。但是你知道嗎&#xff1f;在c89/c99的語言標準中&#xff0c;main函數的聲…

如何簡單實現發版不影響客戶使用?nginx負載

nginx負載發版不影響客戶使用 1.需要二臺服務器 2.二臺服務器均是正式環境配置 3.服務器Nginx配置修改 發版順序&#xff1a;先在服務器2發版&#xff0c;發布成功后&#xff0c;再改服務器Nginx配置&#xff0c;重新加載nginx&#xff1b;然后在服務器再發版&#xff0c;發布成…

qt筆記(1)——Qtablewidget使用

1.基礎使用方法 &#xff08;略&#xff09; 2.坑和注意點 2.1 設置一個單元格的編輯屬性 在代碼中&#xff0c;想要修改一個單元格的編輯屬性&#xff0c;需要對這個item的flags進行設置&#xff1b;注意對一個tablewidget的一個item成員進行設置后&#xff0c;進行一次編…

字符串的模糊匹配方法介紹

字符串的模糊匹配方法介紹 目錄字符串的模糊匹配方法介紹一、編輯距離&#xff08;Levenshtein Distance&#xff09;復雜度分析二、Jaro-Winkler 距離復雜度分析三、最長公共子序列&#xff08;LCS&#xff09;復雜度分析四、模糊搜索&#xff08;Fuzzy Search&#xff09;復雜…

ActiveMQ在Spring Boot中的詳細使用指南

?? 目錄 ?? ActiveMQ簡介 什么是ActiveMQ? 核心概念 ??? 基礎架構組件 ?? 重要概念解釋 ActiveMQ vs 其他消息中間件 ?? 環境搭建 1. ActiveMQ服務端安裝 Docker方式(推薦初學者) 手動安裝方式 2. 驗證安裝 訪問Web管理界面 連接參數 測試連接 ?…

二元一次方程

前言 最近剛學二元一次方程&#xff0c;想寫一篇專欄熟悉一下本文寫給初一的同學看&#xff0c;學過的就劃了吧二元一次方程 兩個未知數最高項次數為 111 次為整式方程二元一次方程的解不唯一&#xff0c;但是二元一次方程可以用一個未知數來表達另一個未知數eg:eg:eg: xy1x y…

AI編程的未來是智能體原生開發?

目錄 前言 一、從“串行”到“并行”&#xff1a;什么是智能體原生開發&#xff1f; 1.1 傳統模式&#xff08;串行思維&#xff09; 1.2 智能體原生模式&#xff08;并行思維&#xff09; 二、程序員的新角色&#xff1a;從代碼手藝人到系統思想家 三、軟件開發的終局&a…

【牛客刷題】小紅的與運算

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 示例二、 解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、解法實現3.1 解法一:基礎實現3.1.1 初級版本分析3.2 解法二:優化版本(推薦)3.2.1 優化版本分析四、總結與拓展4.1 關鍵優化技術4.2 算…