JavaScript 作用域 與 var、let、const關鍵字

目錄

一、JavaScript 作用域

1、全局作用域

2、函數作用域

3、塊級作用域

4、綜合示例

5、總結

二、var、let、const

1、var 關鍵字

2、let 關鍵字

3、const 關鍵字

4、總結

5、使用場景


一、JavaScript 作用域

在JavaScript中,作用域是指程序中可訪問變量(對象和函數同樣也是變量)的集合

作用域決定了變量的可見性和生命周期;

簡單來說(個人理解):作用域就是指,變量能夠正常被訪問的區域;

有三種主要的作用域類型:全局作用域、函數作用域、塊級作用域;

1、全局作用域

  • 當在函數外部聲明變量時,默認在全局作用域中,即為全局變量;
  • 該變量可以在整個程序的任何地方(在所有腳本和函數中)使用, 直到它們被銷毀或程序結束;
  • 全局變量通常在瀏覽器環境中由window對象持有;
  • window對象的內置屬性都擁有全局作用域;
<script>var myName  = "zyl";console.log("全局作用域中的myName :", myName );console.log(window.myName );
</script>

?注意:在全局作用域中聲明的myName變量,被window對象持有;

2、函數作用域

  • 當在函數內部聲明變量時,即在函數作用域中;
  • 該變量只在該函數內部可見;
  • 函數作用變量在函數執行完畢后會被銷毀,除非它們被返回或以其他方式被外部作用域引用;
<script>function fn(){var myName = "zyl";console.log("函數作用域中的myName:", myName);}fn();console.log(myName);    //ReferenceError: myName is not defined
</script>

注意:在函數作用域中聲明的變量只在函數內部可見,函數外面時訪問不到的;?

3、塊級作用域

  • JavaScript ES6 引入了塊級作用域,通過let和const關鍵字聲明變量,它們只在聲明所在的代碼塊內可見;
  • 這種作用域提供了更細粒度的控制,可以避免全局污染;
  • 塊級作用域在循環內部聲明變量時特別有用;
<script>{let myName  = "zyl";console.log("塊級作用域中的myName :", myName );}console.log(myName);
</script>

?注意:在塊級作用域中聲明的變量,只在該塊內可見,代碼塊的外面是訪問不到的;

4、綜合示例

<script>var globalVar = "全局作用域";function fn(){var fnVar = "函數作用域";{let blockVar = "塊級作用域";console.log("代碼塊中,訪問塊級作用域中的變量,blockVar:", blockVar);console.log("代碼塊中,訪問函數作用域中的變量,fnVar:", fnVar);console.log("代碼塊中,訪問全局作用域中的變量,globalVar:", globalVar);}// console.log("函數中,訪問塊級作用域中的變量,blockVar:", blockVar);    // 報錯:ReferenceError: blockVar is not definedconsole.log("函數中,訪問函數作用域中的變量,fnVar:", fnVar);console.log("函數中,訪問全局作用域中的變量,globalVar:", globalVar);}fn();// console.log("函數外部,訪問塊級作用域中的變量,blockVar:", blockVar);  // 報錯:ReferenceError: blockVar is not defined// console.log("函數外部,訪問函數作用域中的變量,fnVar:", fnvar);    // 報錯:ReferenceError: fnvar is not definedconsole.log("函數外部,訪問全局作用域中的變量,globalVar:", globalVar);
</script>

5、總結

  • 塊級作用域中聲明的變量,只能夠在該塊內被訪問;
  • 函數作用域中聲明的變量,只能在函數內部,以及該函數內部的代碼塊中被訪問;
  • 全局作用域中聲明的變量,能在任何地方被訪問;

二、var、let、const

在JavaScript中,聲明變量需要使用varletconst關鍵字,這三者有和特點和區別?

1、var 關鍵字

(1)聲明全局變量

使用 var 關鍵字在全局作用域中聲明的變量,即為全局變量;

改變了被window對象持有;

可以在任何地方被訪問;

var price = "10.00"
console.log("全局作用域,price值為:", price);
console.log("window對象的price,值為:", window.price);function fn() {console.log("函數作用域,price值為:", price);{console.log("塊級作用域,price值為:", price);}
}
fn();

(2)聲明局部變量

使用 var 關鍵字在函數作用域中聲明的變量,即為局部變量;

只能在函數內,包括函數內的代碼塊中被訪問;

不能在函數作用域外被訪問;

function fn() {var price = "10.00"console.log("函數作用域,price值為:", price);{console.log("塊級作用域,price值為:", price);}
}
fn();console.log("全局作用域,price值為:", price);      // 報錯:ReferenceError: price is not defined

(3)存在變量提升

使用var關鍵字聲明的變量,存在變量提升;

存在變量提升:在代碼執行前,變量的聲明已經被提升到了函數的頂部,但沒有初始化;

console.log("使用var聲明之前,price值為:", price);
var price = "10.00"
console.log("使用var聲明之后,price值為:", price);

注意:

這里在使用var聲明price之前,打印輸出price并沒有報錯,而是輸出了undefined;

這是因為使用var關鍵字聲明的變量,存在變量提升;

執行下面的代碼時:

...
console.log("使用var聲明之前,price值為:", price);
var price = "10.00"
...

相當于執行:

...
var price;
console.log("使用var聲明之前,price值為:", price);
price = "10.00"
...

(4)聲明的變量,可以被重新賦值

使用var關鍵字聲明的是變量,可以被重新賦值;

var price = "10.00"
console.log("使用var聲明變量price,值為:", price);price = "9.99"
console.log("修改后的price,值為:",price);

(5)聲明的變量,可以被重新聲明

使用var關鍵字重復聲明同一個變量時,后續的聲明會覆蓋之前的;

var price = "10.00"
console.log("var聲明變量price,值為:", price);var price = "9.99"
console.log("var聲明變量price,值為",price);

(6)一次可以聲明多個變量

使用var關鍵字一次可以聲明多個變量,中間用逗號隔開即可;

var price = "10.00", conut = 20;
console.log("var聲明變量price,值為:", price);
console.log("var聲明變量count,值為",conut);

2、let 關鍵字

(1)聲明塊級作用域變量

使用let關鍵字聲明的變量只在let命令所在的代碼塊內部有效,即let所在的{ }內;

function fn() {let count = 99;console.log("count值為:", count);{let count = 88;console.log("count值為:", count);}console.log("count值為:", count);
}
fn();

(2)不存在變量提升

使用let關鍵字聲明的變量不存在變量提升,只能在聲明之后被訪問;

如果在聲明之前訪問變量,將會拋出一個引用錯誤;

// console.log("使用let聲明之前,count值為:", count);     // 報錯:ReferenceError: Cannot access 'count' before initialization
let count = 99;
console.log("使用let聲明之后,count值為:", count);

(3)聲明的變量,可以被重新賦值

使用let關鍵字聲明的變量,可以被重新賦值;

let count = 99;
console.log("使用let聲明變量count,值為:", count);count = 88
console.log("修改后的count,值為:", count);

(4)聲明的變量,不能被重新聲明

使用let關鍵字聲明的變量,不能被重新聲明;

let count = 99;
console.log("使用let聲明變量count,值為:", count);let count = 88      // 報錯: SyntaxError: Identifier 'count' has already been declared 

(5)一次可以聲明多個變量

使用let關鍵字一次可以聲明多個變量,中間用逗號隔開即可;

let price = "10.00", conut = 99;
console.log("let聲明變量price,值為:", price);
console.log("let聲明變量count,值為",conut);

3、const 關鍵字

const關鍵字的特點與let相似,主要區別在于const關鍵字用來聲明只讀的變量,即常量,不能被重新賦值;

(1)聲明塊級作用域變量

使用const關鍵字聲明的變量只在const命令所在的代碼塊內部有效,即const所在的{ }內;

function fn() {const product = "蘋果";console.log("product值為:", product);{const product = "西瓜";console.log("product值為:", product);}console.log("product值為:", product);
}
fn();

(2)不存在變量提升

使用const關鍵字聲明的變量不存在變量提升,只能在聲明之后被訪問;

如果在聲明之前訪問變量,將會拋出一個引用錯誤;

// console.log("使用const聲明之前,product值為:", product);     // 報錯:ReferenceError: Cannot access 'product' before initialization
const product = "蘋果";
console.log("使用const聲明之后,product值為:", product);

(3)聲明的變量,不能被重新賦值

使用const關鍵字聲明的變量,不能被重新賦值;

該變量是只讀的,即常量;

const product = "蘋果";
console.log("使用const聲明變量product,值為:", product);product = "西瓜";   // 報錯:TypeError: Assignment to constant variable.

(4)聲明的變量,不能被重新聲明

使用const關鍵字聲明的變量,不能被重新聲明;

const product = "蘋果";
console.log("使用const聲明變量product,值為:", product);const product = "西瓜";   // 報錯:SyntaxError: Identifier 'product' has already been declared

(5)一次可以聲明多個變量

使用const關鍵字一次可以聲明多個變量,中間用逗號隔開即可;

const price = "9.99", count = 99,  product = "蘋果";
console.log("使用const聲明變量price,值為:", price);
console.log("使用const聲明變量count,值為:", count);
console.log("使用const聲明變量product,值為:", product);

4、總結

(1)var、let、const 的不同點

序號不同點說明
1變量作用域

var用來聲明全局變量和局部變量;

let和const用來聲明塊級作用域中的變量;

2變量提升

var聲明的變量存在變量提升;

let和const聲明的變量不存在變量提升(只能在聲明之后訪問);

3重新賦值

var和let聲明的變量可以被重新賦值;

const聲明的變量不能被重新賦值(只讀,常量);

4重新聲明

var聲明的變量可以被重新聲明;

let和const聲明的變量不能被重新聲明;

(2)var、let、const 的相同點

var、let、const 都用來聲明變量;

var、let、const 都可以同時聲明多個變量;

5、使用場景

var、let、const 三個關鍵字的使用取決于聲明變量的場景;

  • 聲明常量(只讀的變量),用const;
  • 聲明塊級作用域中的變量,用let;
  • 聲明全局變量,用var;
  • 優先級:const > let > var;

通常推薦使用 let 和 const,它們提供了更好的作用域管理,減少了由變量提升導致的錯誤;

======================================================================

每天進步一點點~~!

記錄一下這個JavaScript中的這個基礎內容!

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

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

相關文章

訂單到期關閉

文章目錄 前言一、場景&#xff1f;二、使用步驟1.項目配置好rocketmq2.讀入數據 其他方式處理訂單到期關閉定時任務 前言 實習期間在做訂單模塊。遇到過訂單到時關閉的場景。 因為我們在通過回調接收第三方訂單狀態的時候&#xff0c;使用了rocketmq&#xff0c;在遇到訂單超…

叁[3],使用Newtonsoft.Json.dll,異常記錄

開發環境 VS2022/.net6.0/WPF 1&#xff0c;異常1,反序列化數組異常。 convertError:"[{"不拉不拉***************************** 原因&#xff1a;檢查是Json字符串的數組格式異常。 正常數組字符串 "result":[{"key1":"value1"…

神經網絡構成、優化、常用函數+激活函數

Iris分類 數據集介紹&#xff0c;共有數據150組&#xff0c;每組包括長寬等4個輸入特征&#xff0c;同時給出輸入特征對應的Iris類別&#xff0c;分別用0&#xff0c;1&#xff0c;2表示。 從sklearn包datasets讀入數據集。 from sklearn import darasets from pandas impor…

vulnhub-NOOB-1

確認靶機 掃描靶機發現ftp Anonymous 的A大小寫都可以 查看文件 解密 登錄網頁 點擊about us會下載一個壓縮包 使用工具提取 steghide info 目標文件 //查看隱藏信息 steghide extract -sf 目標文件 //提取隱藏的文件 steghide embed -cf 隱藏信息的文件 -ef…

什么樣的開放式耳機好用舒服?南卡、倍思、Oladance高人氣質量絕佳產品力薦!

?開放式耳機在如今社會中已經迅速成為大家購買耳機的新趨勢&#xff0c;深受喜歡聽歌和熱愛運動的人群歡迎。當大家談到佩戴的穩固性時&#xff0c;開放式耳機都會收到一致好評。對于熱愛運動的人士而言&#xff0c;高品質的開放式耳機無疑是理想之選。特別是在近年來的一些騎…

算法學習記錄4

L2-012 關于堆的判斷 def checkHeap(heap, target):if target 0:return heapif heap[target] < heap[(target - 1) // 2]:temp heap[target]heap[target] heap[(target - 1) // 2]heap[(target - 1) // 2] tempheap checkHeap(heap, (target - 1) // 2)return heapdef…

2024.7.7刷題記錄

目錄 一、849. Dijkstra求最短路 I - AcWing題庫 二、850. Dijkstra求最短路 II - AcWing題庫 根據講解視頻寫的代碼 一、849. Dijkstra求最短路 I - AcWing題庫 N 600 MAXL 10010 # 最長邊長 # 稠密圖鄰接矩陣 g [[MAXL] * N for _ in range(N)] dist [MAXL] * N …

圖片kb太大了怎么改小?修改圖片kb的方法介紹

圖片kb太大了怎么改小&#xff1f;將圖片的文件大小&#xff08;以KB為單位&#xff09;縮小可以帶來多種優點&#xff0c;但也有一些缺點需要注意。縮小圖片文件大小可以顯著減少它在硬盤或其他存儲設備上占用的空間&#xff0c;使你能夠存儲更多的圖片和其他文件。而且&#…

KIVY 3D Rotating Monkey Head?

7 Python Kivy Projects (With Full Tutorials) – Pythonista Planet KIVY 3D Rotating Monkey Head kivy 3D 旋轉猴子頭How to display rotating monkey example in a given layout. Issue #6688 kivy/kivy GitHub 3d 模型下載鏈接 P99 - Download Free 3D model by …

【Qt】QItemSelectionModel 添加選中行

1. 介紹 QItemSelectionModel 中沒有直接添加選中行的方法&#xff0c;可以通過下面的方式添加。 2. 代碼 //定義 QSqlTableModel* m_tableModel; QItemSelectionModel* m_selectionModel;//添加選中行, 全選 void addAllLine() {for(int i0; i<m_tableModel->rowCoun…

【AI大模型新型智算中心技術體系深度分析 2024】

文末有福利&#xff01; ChatGPT 系 列 大 模 型 的 發 布&#xff0c; 不 僅 引 爆 全 球 科 技 圈&#xff0c; 更 加 夯 實 了 人 工 智 能&#xff08;Artificial Intelligence, AI&#xff09;在未來改變人類生產生活方式、引發社會文明和競爭力代際躍遷的戰略性地位。當…

mysql select count返回null

注意 mysql select count返回null 下面是百度的回答 在MySQL中&#xff0c;當SELECT COUNT(*)查詢返回NULL時&#xff0c;通常意味著查詢結果為空集&#xff0c;即沒有記錄匹配查詢條件。COUNT()函數在沒有匹配行的情況下返回NULL&#xff0c;而不是0。 解決方法&#xff1a…

ImportError: xxx: cannot open shared object file: No such file or directory

一類常見錯誤&#xff1a;編譯器器無法在目錄下找到共享目標文件&#xff0c; Linux(ubuntu)中共享的庫目錄為/usr/lib/x86_64-linux-gnu&#xff0c;gcc的編譯庫 在該目錄下創建共享文件&#xff08;偽造、下載&#x1f91c;cp)即可 sudo ln -s libtiff.so.6 libtiff.so.5

昇思25天學習打卡營第11天|ResNet50圖像分類

文章目錄 昇思MindSpore應用實踐基于MindSpore的ResNet50圖像分類1、ResNet50 簡介2、數據集預處理及可視化3、構建網絡構建 Building Block構建 Bottleneck Block構建 ResNet50 網絡 4、模型訓練5、圖像分類模型推理 Reference 昇思MindSpore應用實踐 本系列文章主要用于記錄…

Emacs相關

Emacs 詳細介紹 Emacs&#xff0c;全稱 Editor MACroS&#xff0c;是一款功能強大、歷史悠久的文本編輯器。它最早由 Richard Stallman 于 1976 年開發&#xff0c;是自由軟件運動的重要組成部分。Emacs 的設計理念強調可定制性和擴展性&#xff0c;使得它不僅僅是一個編輯器&…

AsyncRequestTimeoutException

在Spring MVC中&#xff0c;當一個異步請求超過配置的最大等待時間時&#xff0c;會拋出AsyncRequestTimeoutException異常。這個異常通常是由于服務器端的處理時間超過了客戶端允許的等待時間&#xff0c;或者是服務器本身的異步處理時間配置過短導致的。 spring: mvc: async…

scrapy寫爬蟲

Scrapy是一個用于爬取網站數據并提取結構化信息的Python框架 一、Scrapy介紹 1.引擎&#xff08;Engine&#xff09; – Scrapy的引擎是控制數據流和觸發事件的核心。它管理著Spider發送的請求和接收的響應&#xff0c;以及處理Spider生成的Item。引擎是Scrapy運行的驅動力。…

基于go-zero二次開發的腳本

param$2 # 字符串風格格式為&#xff1a;DemoName model_name$(echo "${param}" | awk -F _ {for(i1;i<NF;i) $itoupper(substr($i,1,1)) tolower(substr($i,2));}1 | tr -d ) # 字符串風格格式為&#xff1a;demoName struct_name$(echo "${model_name}&qu…

ClickHouse表引擎概述

ClickHouse表引擎概述 表引擎的功能&#xff1a; 數據的存儲方式 數據的存儲位置 是否可以使用索引 是否可以使用分區 是否支持數據副本 并發數據訪問 ClickHouse在建表時必須指定表引擎。 表引擎主要分為四大類&#xff1a;MergeTree系列、Log系列、與其他存儲/處理系…

字節碼編程bytebuddy之獲取方法信息和方法入參信息

寫在前面 本文看下通過bytebuddy如何獲取方法信息和方法的入參信息。 1&#xff1a;代碼 package com.dahuyou.bytebuddy.bb;import com.dahuyou.bytebuddy.TT; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implement…