js進階筆記之作用域

目錄

全局作用域

局部作用域

函數作用域

塊作用域

作用域鏈

閉包

垃圾回收機制


作用域(scope)規定了變量能夠被訪問的“范圍”,離開了這個“范圍”變量便不能被訪問,作用域分為全局作用域和局部作用域。

全局作用域

<script> 標簽和 .js 文件的【最外層】就是所謂的全局作用域,在此聲明的變量在函數內部也可以被訪問

<script>// 此處是全局function sayHi() {// 此處為局部}// 此處為全局
</script>

全局作用域中聲明的變量,任何其它作用域都可以被訪問,如下代碼所示 ?

<script>// 全局變量 nameconst name = '小明'// 函數作用域中訪問全局function sayHi() {// 此處為局部console.log('你好' + name)}// 全局變量 flag 和 xconst flag = truelet x = 10// 塊作用域中訪問全局if(flag) {let y = 5console.log(x + y) // x 是全局的}
</script>

總結:

  1. window 對象動態添加的屬性默認也是全局的,不推薦!

  2. 函數中未使用任何關鍵字聲明的變量為全局變量,不推薦!!!

  3. 盡可能少的聲明全局變量,防止全局變量被污染

JavaScript 中的作用域是程序被執行時的底層機制,了解這一機制有助于規范代碼書寫習慣,避免因作用域導致的語法錯誤。

?

?

局部作用域

局部作用域分為函數作用域和塊作用域。

函數作用域

在函數內部聲明的變量只能在函數內部被訪問,外部無法直接訪問。

<script>// 聲明 counter 函數function counter(x, y) {// 函數內部聲明的變量const s = x + yconsole.log(s) // 18}// 設用 counter 函數counter(10, 8)// 訪問變量 sconsole.log(s)// 報錯
</script>

總結:?

  1. 函數內部聲明的變量,在函數外部無法被訪問

  2. 函數的參數也是函數內部的局部變量

  3. 不同函數內部聲明的變量無法互相訪問

  4. 函數執行完畢后,函數內部的變量實際被清空了

塊作用域

在 JavaScript 中使用 {} 包裹的代碼稱為代碼塊,代碼塊內部聲明的變量外部將【有可能】無法被訪問。

<script>{// age 只能在該代碼塊中被訪問let age = 18;console.log(age); // 正常}// 超出了 age 的作用域console.log(age) // 報錯let flag = true;if(flag) {// str 只能在該代碼塊中被訪問let str = 'hello world!'console.log(str); // 正常}// 超出了 age 的作用域console.log(str); // 報錯for(let t = 1; t <= 6; t++) {// t 只能在該代碼塊中被訪問console.log(t); // 正常}// 超出了 t 的作用域console.log(t); // 報錯
</script>

JavaScript 中除了變量外還有常量,常量與變量本質的區別是【常量必須要有值且不允許被重新賦值】,常量值為對象時其屬性和方法允許重新賦值。

<script>// 必須要有值const version = '1.0.0';// 不能重新賦值// version = '1.0.1';// 常量值為對象類型const user = {name: '小明',age: 18}// 不能重新賦值user = {};// 屬性和方法允許被修改user.name = '小明明';user.gender = '男';
</script>

總結:

  1. let 聲明的變量會產生塊作用域,var 不會產生塊作用域

  2. const 聲明的常量也會產生塊作用域

  3. 不同代碼塊之間的變量無法互相訪問

  4. 推薦使用 letconst

作用域鏈

作用域鏈本質上是底層的變量查找機制,在函數被執行時,會優先查找當前函數作用域中查找變量,如果當前作用域查找不到則會依次逐級查找父級作用域直到全局作用域

<script>// 全局作用域let a = 1let b = 2// 局部作用域function f() {let c// let a = 10;console.log(a) // 1 或 10console.log(d) // 報錯// 局部作用域function g() {let d = 'yo'// let b = 20;console.log(b) // 2 或 20}// 調用 g 函數g()}console.log(c) // 報錯console.log(d) // 報錯f();
</script>

?

  1. 嵌套關系的作用域串聯起來形成了作用域鏈

  2. 相同作用域鏈中按著從小到大的規則查找變量

  3. 子作用域能夠訪問父作用域,父級作用域無法訪問子級作用域

閉包

閉包概念? :? 內部函數及其對外部變量的引用捆綁在一起
? ? ? ? ? ? ? ? ? ? ? ?或? 內部函數訪問外部函數的變量?

形成條件:閉包 ? ? 內部函數+外部函數 ?(提供一個變量)


?? ?作用:閉包 ? ?延伸變量的作用域,形成獨立的作用域

?? ?原理:作用域鏈

?? ?缺點:容易造成內存泄漏(內存因某種原因無法釋放)

<body><script>// 1. 閉包 : 內層函數 + 外層函數變量// function outer() {//   const a = 1//   function f() {//     console.log(a)//   }//   f()// }// outer()// 2. 閉包的應用: 實現數據的私有。統計函數的調用次數// let count = 1// function fn() {//   count++//   console.log(`函數被調用${count}次`)// }// 3. 閉包的寫法  統計函數的調用次數function outer() {let count = 1function fn() {count++console.log(`函數被調用${count}次`)}return fn}const re = outer()// const re = function fn() {//   count++//   console.log(`函數被調用${count}次`)// }re()re()// const fn = function() { }  函數表達式// 4. 閉包存在的問題: 可能會造成內存泄漏</script>
</body>

垃圾回收機制


?? ?JS為我們聲明的變量、函數等分配內存,當這些變量、函數、對象的內存不再使用->垃圾

?? ?垃圾回收(GC)機制

?? ?引用計數------ie瀏覽器
?? ?
?? ?簡單,容易造成內存泄漏


?? ?標記清除

?? ?標記通過全局標記所有從全局出發能夠訪問到的對象,不能夠訪問到的對象未被標記

// 垃圾回收(GC)機制// let cat = { name: '貓', age: 10 }// console.log(cat.name)// cat = null// 引用計數-ie瀏覽器// 簡單。容易造成內存泄漏// let cat = { name: '貓', age: 10 }// let cat2 = cat// cat = nullfunction f() {let o = {a: 1,}let o2 = {b: 2,}o.b = o2o2.a = o}f()// 標記清除// 標記 通過全局 標記所有從全局出發能夠訪問到的對象,不能夠訪問到的對象未被標記function fn() {c = {}let o = {}let o2 = {}o.a = o2o2.b = o}fn()console.log(c)

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

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

相關文章

【Go語言從入門到實戰】反射編程、Unsafe篇

反射編程 reflect.TypeOf vs reflect.ValueOf func TestTypeAndValue(t *testing.T) {var a int64 10t.Log(reflect.TypeOf(a), reflect.ValueOf(a))t.Log(reflect.ValueOf(a).Type()) }判斷類型 - Kind() 當我們需要對反射回來的類型做判斷時&#xff0c;Go 語言內置了一個…

【23真題】最簡單的211!均分141分!

今天分享的是23年河海大學863的信號與系統試題及解析。 我猜測是由于23年太簡單&#xff0c;均分都141分&#xff0c;導致24考研臨時新增一門數字信號處理&#xff01;今年考研的同學趕不上這么簡單的專業課啦&#xff01; 本套試卷難度分析&#xff1a;平均分為102和141分&a…

ECharts與DataV:數據可視化的得力助手

文章目錄 引言一、ECharts簡介優勢&#xff1a;劣勢&#xff1a; 二、DataV簡介優勢&#xff1a;劣勢&#xff1a; 三、ECharts與DataV的聯系四、區別與選擇五、如何選擇根據需求選擇技術棧考慮預算和商業考慮 結論我是將軍&#xff0c;我一直都在&#xff0c;。&#xff01; 引…

LeetCode題解:13. 羅馬數字轉整數,哈希表,JavaScript,詳細注釋

原題鏈接&#xff1a;13. 羅馬數字轉整數 解題思路&#xff1a; 本題涉及到的羅馬數字都是唯一的&#xff0c;因此可以創建一個哈希表&#xff0c;存儲羅馬數字和整數的對應關系。遍歷s&#xff0c;分別截取從i開始的2位和1位字符串&#xff0c;查看其在哈希表中的羅馬數字對…

pytest調用其他測試用例方法

pytest調用其他測試用例方法 一. 第一種方法&#xff0c;測試用例前置pytest.fixture() def test1():print("我是用例一") pytest.fixture(test1) def test2():print("我是用例二")二.第二種方法,如果不是同一文件中測試用例調用或者同一py文件中 def t…

3.10-容器的操作

這一節講解一下對于container我們可以進行哪些操作&#xff1f; 可以使用以下命令來停止正在運行的Docker容器&#xff1a; docker container stop <CONTAINER ID> 關于運行中的容器&#xff0c;我們可以進行的操作&#xff1a; 第一個是docker exec命令&#xff0c;這個…

NLP實踐——LLM生成過程中防止重復循環

NLP實踐——LLM生成過程中防止重復 1. 準備工作2. 問題分析3. 創建processor3.1 防止重復生成的processor3.2 防止數字無規則循環的processor 4. 使用 本文介紹如何使用LogitsProcessor避免大模型在生成過程中出現重復的問題。 1. 準備工作 首先實例化一個大模型&#xff0c;…

實時語音克隆:5 秒內生成任意文本的語音 | 開源日報 No.84

CorentinJ/Real-Time-Voice-Cloning Stars: 43.3k License: NOASSERTION 這個開源項目是一個實時語音克隆工具&#xff0c;可以在5秒內復制一種聲音&#xff0c;并生成任意文本的語音。 該項目的主要功能包括&#xff1a; 從幾秒鐘的錄音中創建聲紋模型根據給定文本使用參考…

數字化轉型沒錢?沒人?沒IT?低代碼平臺輕松幫你搞定

隨著數字技術的不斷滲透&#xff0c;數字化已經不僅僅是一個趨勢&#xff0c;而是深入人心的日常生活部分。在這樣的時代背景下&#xff0c;企業面臨的挑戰也愈發嚴峻&#xff1a;如何不斷創新&#xff0c;滿足用戶日益增長的業務需求&#xff1f; 傳統的開發方式&#xff0c;隨…

基于單片機設計的大氣氣壓檢測裝置(STC89C52+BMP180實現)

一、前言 本項目設計一個大氣氣壓檢測裝置&#xff0c;該裝置以單片機為基礎&#xff0c;采用STC89C52作為核心控制芯片&#xff0c;結合BMP180模塊作為氣壓傳感器。大氣氣壓&#xff0c;也就是由氣體重力在大氣層中產生的壓力&#xff0c;其變化與天氣預報、氣象觀測以及高度…

江蘇某市人民醫院實現IT基礎資源統一監控

一、背景介紹 江蘇某市人民醫院是一家擁有豐富醫療資源和龐大患者群體的醫療機構。隨著醫療業務的不斷發展&#xff0c;其IT系統的規模和復雜性也不斷增加&#xff0c;涉及各類IT資源&#xff0c;包括服務器、網絡設備、數據庫、應用軟件等。為了提高IT系統的可靠性和穩定性&am…

11.7統一功能處理

一.登錄攔截器 1.實現一個普通的類,實現HeadlerInterceptor接口,重寫preHeadler方法. 2.將攔截器添加到配置中,并設定攔截規則. 二.訪問前綴添加 方法1: 方法2:properties 三.統一異常處理 以上返回的是空指針異常,如果是別的異常就不會識別,建議加上最終異常 . 四.統一數據格…

英語學習軟件 Eudic歐路詞典 mac中文版介紹說明

歐路詞典 mac (Eudic) 是一個功能強大的英語學習工具&#xff0c;它包含了豐富的英語詞匯、短語和例句&#xff0c;并提供了發音、例句朗讀、單詞筆記等功能。 Eudic歐路詞典 mac 軟件介紹 多語種支持&#xff1a;歐路詞典支持多種語言&#xff0c;包括英語、中文、日語、法語…

uni微信小程序 map 添加padding

問題背景&#xff1a; 規劃駕車線路的時候&#xff0c;使用uni的include-points指定可視范圍的時候&#xff0c;會很極限。導致marker不能完全顯示。 解決方法 給地圖顯示范圍添加padding (推薦) <mapid"myMap":markers"markers":polyline"pol…

視頻服務網關的三大部署(二)

視頻網關是軟硬一體的一款產品&#xff0c;可提供多協議&#xff08;RTSP/ONVIF/GB28181/海康ISUP/EHOME/大華、海康SDK等&#xff09;的設備視頻接入、采集、處理、存儲和分發等服務&#xff0c; 配合視頻網關云管理平臺&#xff0c;可廣泛應用于安防監控、智能檢測、智慧園區…

spark寫入關系型數據庫的duplicateIncs參數使用

在看一段spark寫數據到關系型數據庫代碼時&#xff0c;發現一個參數沒有見過&#xff1a; df.write.format("org.apache.spark.sql.execution.datasources.jdbc2").options(Map("savemode" -> JDBCSaveMode.Update.toString,"driver" -> …

Android13 launcher循環切頁

launcher 常規切頁&#xff1a;https://blog.csdn.net/a396604593/article/details/125305234 循環切頁 我們知道&#xff0c;launcher切頁是在packages\apps\Launcher3\src\com\android\launcher3\PagedView.java的onTouchEvent中實現的。 1、滑動限制 public boolean onT…

Python與設計模式--門面模式

8-Python與設計模式–門面模式 一、火警報警器&#xff08;1&#xff09; 假設有一組火警報警系統&#xff0c;由三個子元件構成&#xff1a;一個警報器&#xff0c;一個噴水器&#xff0c; 一個自動撥打電話的裝置。其抽象如下&#xff1a; class AlarmSensor:def run(self):…

c語言習題1124

分別定義函數求圓的面積和周長。 寫一個函數&#xff0c;分別求三個數當中的最大數。 寫一個函數&#xff0c;計算輸入n個數的乘積 一個判斷素數的函數&#xff0c;在主函數輸入一個整數&#xff0c;輸出是否為素數的信息 寫一個函數求n! ,利用該函數求1&#xff01;2&…

功率半導體器件CV測試系統

概述 電容-電壓(C-V)測量廣泛用于測量半導體參數&#xff0c;尤其是MOS CAP和MOSFET結構。MOS(金屬-氧化物-半導體)結構的電容是外加電壓的函數&#xff0c;MOS電容隨外加電壓變化的曲線稱之為C-V曲線&#xff08;簡稱C-V特性&#xff09;&#xff0c;C-V 曲線測試可以方便的確…