掌握JavaScript函數封裝與作用域

JavaScript 基礎 - 第4天筆記

理解封裝的意義,能夠通過函數的聲明實現邏輯的封裝,知道對象數據類型的特征,結合數學對象實現簡單計算功能。

  • 理解函數的封裝的特征

  • 掌握函數聲明的語法

  • 理解什么是函數的返回值

  • 知道并能使用常見的內置函數

函數

理解函數的封裝特性,掌握函數的語法規則

聲明和調用

函數可以把具有相同或相似邏輯的代碼“包裹”起來,通過函數調用執行這些被“包裹”的代碼邏輯,這么做的優勢是有利于精簡代碼方便復用。

聲明(定義)

聲明(定義)一個完整函數包括關鍵字、函數名、形式參數、函數體、返回值5個部分

調用

聲明(定義)的函數必須調用才會真正被執行,使用 () 調用函數。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 聲明和調用</title>
</head>
<body><script>// 聲明(定義)了最簡單的函數,既沒有形式參數,也沒有返回值function sayHi() {console.log('嗨~')}// 函數調用,這些函數體內的代碼邏輯會被執行// 函數名()sayHi()// 可以重復被調用,多少次都可以sayHi()</script>
</body>
</html>

注:函數名的命名規則與變量是一致的,并且盡量保證函數名的語義。

小案例: 小星星

<script>// 函數聲明function sayHi() {// document.write('hai~')document.write(`*<br>`)document.write(`**<br>`)document.write(`***<br>`)document.write(`****<br>`)document.write(`*****<br>`)document.write(`******<br>`)document.write(`*******<br>`)document.write(`********<br>`)document.write(`*********<br>`)}// 函數調用sayHi()sayHi()sayHi()sayHi()sayHi()</script>

參數

通過向函數傳遞參數,可以讓函數更加靈活多變,參數可以理解成是一個變量。

聲明(定義)一個功能為打招呼的函數

  • 傳入數據列表

  • 聲明這個函數需要傳入幾個數據

  • 多個數據用逗號隔開

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 函數參數</title>
</head>
<body>
?<script>// 聲明(定義)一個功能為打招呼的函數// function sayHi() {// ? console.log('嗨~')// }// 調用函數// sayHi()?// 這個函數似乎沒有什么價值,除非能夠向不同的人打招呼// 這就需要借助參數來實現了function sayHi(name) {// 參數 name 可以被理解成是一個變量console.log(name)console.log('嗨~' + name)}
?// 調用 sayHi 函數,括號中多了 '小明'// 這時相當于為參數 name 賦值了sayHi('小明')// 結果為 小明
?// 再次調用 sayHi 函數,括號中多了 '小紅'// 這時相當于為參數 name 賦值了sayHi('小紅') // 結果為 小紅</script>
</body>
</html>

總結:

  1. 聲明(定義)函數時的形參沒有數量限制,當有多個形參時使用 , 分隔

  2. 調用函數傳遞的實參要與形參的順序一致

形參和實參

形參:聲明函數時寫在函數名右邊小括號里的叫形參(形式上的參數)

實參:調用函數時寫在函數名右邊小括號里的叫實參(實際上的參數)

形參可以理解為是在這個函數內聲明的變量(比如 num1 = 10)實參可以理解為是給這個變量賦值

開發中盡量保持形參和實參個數一致

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 函數參數</title>
</head>
<body><script>// 聲明(定義)一個計算任意兩數字和的函數// 形參 x 和 y 分別表示任意兩個數字,它們是兩個變量function count(x, y) {console.log(x + y);}// 調用函數,傳入兩個具體的數字做為實參// 此時 10 賦值給了形參 x// 此時 5  賦值給了形參 ycount(10, 5); // 結果為 15</script>
</body>
</html>

返回值

函數的本質是封裝(包裹),函數體內的邏輯執行完畢后,函數外部如何獲得函數內部的執行結果呢?要想獲得函數內部邏輯的執行結果,需要通過 return 這個關鍵字,將內部執行結果傳遞到函數外部,這個被傳遞到外部的結果就是返回值。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 函數返回值</title>
</head>
<body>
?<script>// 定義求和函數function count(a, b) {let s = a + b// s 即為 a + b 的結果// 通過 return 將 s 傳遞到外部return s}
?// 調用函數,如果一個函數有返回值// 那么可將這個返回值賦值給外部的任意變量let total = count(5, 12)</script>
</body>
</html>

總結:

  1. 在函數體中使用return 關鍵字能將內部的執行結果交給函數外部使用

  2. 函數內部只能出現1 次 return,并且 return 下一行代碼不會再被執行,所以return 后面的數據不要換行寫

  3. return會立即結束當前函數

  4. 函數可以沒有return,這種情況默認返回值為 undefined

作用域

通常來說,一段程序代碼中所用到的名字并不總是有效和可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。

作用域的使用提高了程序邏輯的局部性,增強了程序的可靠性,減少了名字沖突。

全局作用域

作用于所有代碼執行的環境(整個 script 標簽內部)或者一個獨立的 js 文件

處于全局作用域內的變量,稱為全局變量

局部作用域

作用于函數內的代碼環境,就是局部作用域。 因為跟函數有關系,所以也稱為函數作用域。

處于局部作用域內的變量稱為局部變量

如果函數內部,變量沒有聲明,直接賦值,也當全局變量看,但是強烈不推薦

但是有一種情況,函數內部的形參可以看做是局部變量。

函數進行查找作用域

依次從里函數向外函數查找變量,換句話來說先看看自己有沒有這個變量,如果有就拿自己的,如果沒有就那外一個函數的,如果還沒有就用全局的,如果依然沒有就undefined

 ? ?<script>let num = 10function fun1() {let num = 20function fun2() {let num = 30function fun3() {// 自己沒有就用fun2的,如果fun2也沒有就用fun1的,如果fun1也沒有就使用全局變量,如果全局變量也沒有,就undefinedconsole.log(num)}fun3()}fun2()
?}fun1()</script>

匿名函數

函數可以分為具名函數和匿名函數

匿名函數:沒有名字的函數,無法直接使用。

函數表達式
// 聲明
let fn = function() { console.log('函數表達式')
}
// 調用
fn()
立即執行函數
(function(){ xxx  })();
(function(){xxxx}());

無需調用,立即執行,其實本質已經調用了

多個立即執行函數之間用分號隔開

?在能夠訪問到的情況下 先局部 局部沒有在找全局

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

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

相關文章

Datawhale AI 夏令營—科大訊飛AI大賽(大模型技術)—讓大模型理解表格數據(列車信息表)

目錄 一、本次賽事目標&#xff1a;讓大模型理解表格數據&#xff08;列車信息表&#xff09; 二、分析賽題、對問題進行建模 賽事背景 賽題解讀 數據分析與探索 賽題要點與難點 解題思考過程 三、Baseline方案 Baseline概況 Baseline運行步驟 Baseline文件概況 Ba…

SSH連接失敗排查與解決教程: Connection refused

前言 當使用云服務器&#xff08;如阿里云、騰訊云、AWS 等&#xff09;時&#xff0c;嘗試在本地PC端使用圖形化工具如 FinalShell、XShell可能會遇到 SSH 連接失敗的問題。本文列舉 SSH 連接失敗的常見原因&#xff0c;并提供對應解決方案&#xff0c;幫助快速定位并解決問題…

性能優化:Vue 3 `v-memo` 指令詳解

v-memo 是 Vue 3 提供的一個性能優化工具&#xff0c;能幫助開發者緩存模板內容&#xff0c;減少不必要的渲染開銷。本文將介紹 v-memo 的引入版本、作用、使用方法和實現原理&#xff0c;并通過示例說明如何使用它。內容基于 Vue 3.5.18&#xff08;截至 2025 年 7 月的最新版…

標準庫開發和寄存器開發的區別

1.標準庫void GPIO_Toggle_INIT(void)//初始化GPIO {GPIO_InitTypeDef GPIO_InitStructure {0};//定義GPIO結構體RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIO時鐘GPIO_InitStructure.GPIO_Pin GPIO_Pin_2;//GPIO引腳選擇GPIO_InitStructure.GPIO_Mode …

在 WebSocket 中使用 @Autowired 時遇到空指針異常

背景&#xff1a;在websocket在有新的連接加入進來時&#xff0c;調用servier中的服務&#xff0c;使用 Autowired 注入的 Bean 竟然是 null&#xff01;這并非 Spring 的 Bug&#xff0c;而是對 WebSocket 生命周期管理理解不足導致的。了解這個問題&#xff0c;我們需要區分兩…

MGER實驗

一、實驗拓撲圖二、配置1.R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有IP地址R1側為15.1.1.1&#xff0c;對應R5為15.1.1.2R2側為25.1.1.2&#xff0c;對應R5為25.1.1.1R3側為35.1.1.2&#xff0c;對應R5為35.1.1.1R4側為45.1.1.2&#xff0c;對應R…

基于 XGBoost 與 SHAP 的醫療自動化辦公與可視化系統(下)

— 登錄接口 — @app.post(“/token”) def login(form_data: OAuth2PasswordRequestForm = Depends()): user = fake_users_db.get(form_data.username) if not user or form_data.password != user[“password”]: raise HTTPException(status_code=400, detail=“用戶名或密…

python學智能算法(二十九)|SVM-拉格朗日函數求解中-KKT條件

引言 前序學習進程中&#xff0c;對拉格朗日函數執行了初步求導&#xff0c;并獲得了簡化后的拉格朗日函數極值計算式&#xff1a; L(w,b,α)∑i1mαi?12∑i,j1mαiαjyiyjxiTxjL(w,b,\alpha)\sum_{i1}^{m}\alpha_{i}-\frac{1}{2}\sum_{i,j1}^{m}\alpha_{i}\alpha_{j}y_{i}y_…

【AI論文】MiroMind-M1:通過情境感知多階段策略優化實現數學推理的開源新進展

摘要&#xff1a;近期&#xff0c;大型語言模型已從流暢的文本生成發展至能在多個領域進行高級推理&#xff0c;由此催生了推理語言模型&#xff08;RLMs&#xff09;。在眾多領域中&#xff0c;數學推理堪稱代表性基準&#xff0c;因為它需要精確的多步驟邏輯與抽象推理能力&a…

《使用Qt Quick從零構建AI螺絲瑕疵檢測系統》——6. 傳統算法實戰:用OpenCV測量螺絲尺寸

目錄一、概述1.1 背景介紹&#xff1a;從“看見”到“看懂”1.2 學習目標二、圖像預處理&#xff1a;讓目標更突出三、輪廓發現與尺寸測量四、總結與展望一、概述 1.1 背景介紹&#xff1a;從“看見”到“看懂” 在上一篇文章中&#xff0c;我們成功地為應用程序安裝了“眼睛…

《人性的弱點》重構【01】

手上有本《人性的弱點》&#xff08;韓文橋 譯&#xff0c;浙江文藝出版社&#xff0c;2017.1出版&#xff09;&#xff0c;前些年買的&#xff0c;近期翻出來看看。這門書雖成書于80多年前&#xff0c;但卡耐基對人性洞察之深刻&#xff0c;時至今日&#xff0c;并未覺得過時。…

k8s開啟審計日志

k8s默認是關閉審計功能的&#xff0c;想看的話需要到apiserver的pod中才可以。 開啟此功能是為了進行k8s審計日志的收集&#xff0c;方便我們查看k8s中用戶的各自操作。 開啟此功能之前&#xff0c;我們要先創建個審計策略文件audit-policy.yaml 例如以下的測驗文件 apiVersion…

Kafka MQ 消費者應用場景

Kafka MQ 消費者應用場景 1 消費者自動提交的時機 在 Kafka 中默認的消費位移的提交方式是自動提交,這個由消費者客戶端參數 enable.auto.commit 配置,默認值為 true。當然這個默認的自動提交不是每消費一條消息就提交一次,而是定期提交,這個定期的周期時間由客戶端參數 …

Git版本控制系統

Git作為目前最流行的分布式版本控制系統&#xff0c;已經成為開發者必備的技能之一。本文將全面介紹Git的核心概念、基本操作、分支管理以及與GitHub的協作開發&#xff0c;幫助讀者從零開始掌握Git的使用。 一、Git概述 1.1 Git發展歷史 Git誕生于2005年&#xff0c;由Linu…

如何編譯RustDesk(Unbuntu 和Android版本)

編譯Linux版本的RustDesk備注&#xff1a;官方文檔上&#xff0c;一邊都是基于sciter&#xff0c;這個在后面已經不建議使用了&#xff0c;但是依然可以編譯剛開始的時候看官方的文檔&#xff0c;涉及的東西比較多&#xff0c;也搞的一頭霧水&#xff0c;通過B站上一個視頻&…

Spring中的循環依賴:解密、破局與架構啟示

> 當兩個Bean緊緊相擁,Spring容器卻陷入死鎖——這是Java開發者的經典噩夢 某電商平臺凌晨上線時突然宕機,日志里反復滾動著`BeanCurrentlyInCreationException`的報錯。經排查,**優惠券服務與庫存服務在初始化時相互依賴**,形成致命閉環。這個價值百萬的故障案例,揭開…

DataFrame?(數據框)

一種二維表格型數據結構&#xff0c;類似于電子表格&#xff08;如 Excel&#xff09;或 SQL 表&#xff0c;由行&#xff08;記錄&#xff09;?和列&#xff08;字段&#xff09;?組成。它是數據分析、機器學習和科學計算中最常用的數據結構之一&#xff0c;尤其在 ?Python…

B站視頻評論數據爬取

爬取B站視頻評論數據爬取與分析 如果只要單純的腳本可以直接看項目結構里的b_comments.py 一、技術架構 1、環境配置 Python 3.8PyCharm 2、模塊配置 requests&#xff1a;用于發送HTTP請求time&#xff1a;用于處理時間相關的操作csv&#xff1a;用于讀寫CSV文件json&#xff…

OpenAI最新大模型GPT-4o體驗之Code Copilot AI編程大模型

一、前言GPT-4o&#xff08;"o"代表"全能"&#xff09;具備處理各種文本、聲音和圖像資料的能力&#xff0c;能夠輸出多種格式的文本、聲音和圖像。GPT-4o 的推出標志著 AI 技術的重大突破。它不再局限于單一媒介&#xff0c;而是首次實現了文本、語音和圖…

社交電商推客系統全棧開發指南:SpringCloud+分潤算法+Flutter跨端

一、推客系統概述與市場背景推客系統&#xff08;TuiKe System&#xff09;是一種基于社交關系的營銷推廣平臺&#xff0c;通過用戶分享商品或服務鏈接&#xff0c;實現裂變式傳播和精準營銷。近年來&#xff0c;隨著社交電商的蓬勃發展&#xff0c;推客系統已成為企業獲客的重…