【JavaScript】七、函數

文章目錄

  • 1、函數的聲明與調用
  • 2、形參默認值
  • 3、函數的返回值
  • 4、變量的作用域
  • 5、變量的訪問原則
  • 6、匿名函數
    • 6.1 函數表達式
    • 6.2 立即執行函數
  • 7、練習
  • 8、邏輯中斷
  • 9、轉為布爾型

在這里插入圖片描述

1、函數的聲明與調用

function 函數名(形參列表) {函數體
}

eg:

// 聲明
function sayHi() {console.log('Hello World!')
}// 調用
sayHi()

在這里插入圖片描述

注意:

  • 形參不需要帶類型

  • 兩個相同的函數后面的會覆蓋前面的函數

  • 參的個數和形參的個數可以不一致,形參過多,默認給undefined,實參過多,多余的實參會被忽略 (函數內部有一個arguments,里面裝著所有的實參)

在這里插入圖片描述

命名規范:

  • 和變量命名基本一致

在這里插入圖片描述

  • 盡量小駝峰式命名法
  • 前綴應該為動詞

在這里插入圖片描述

2、形參默認值

<body><script>function getSum(num1, num2) {document.write(num1 + num2)}// 3getSum(1, 2)// NaNgetSum()</script>
</body>

如上,形參不傳值,計算結果是NaN,形參也是一個變量,不給值,則是undefined,undefined + unfined = NaN,改進下:

function getSum(num1 = 0, num2 = 0) {document.write(num1 + num2)
}

形參默認值只會在缺少實參參數傳遞時才會被執行

// 練習:數組求和函數
<body><script>function getArrSum(array = []) {let sum = 0for (let i = 0; i < array.length; i++) {sum = sum + array[i]}console.log(sum)}getArrSum([1, 2, 3, 4, 5])getArrSum()</script>
</body>

3、函數的返回值

function getSum(num1, num2) {return num1 + num2
}
  • return結果給調用者
  • return 后面代碼不會再被執行
  • return函數可以沒有return語句,此時,默認返回undefined
function getSum(num1, num2) {num1 + num2
}// 調用一個沒有返回結果的函數,查看調用結果
console.log(getSum(1, 2))	//undefined

在這里插入圖片描述

練習: 求一個數組的最大值

<body><script>function getMax(array = []) {let max = array[0]for (let i = 1; i < array.length; i++) {if (max < array[i]) {max = array[i]}}return max}console.log(getMax([1, 3, 4, 6, 9]))</script>
</body>

4、變量的作用域

在這里插入圖片描述

作用域:

在這里插入圖片描述

對應的,變量分為:全局變量和局部變量

在這里插入圖片描述

<body><script>// 全局變量let num = 0// 函數中可以用function getNum() {return num}// 函數外面也能用console.log(num)</script>
</body>
<body><script>function doSome() {// 局部變量let i = 1return i}// 局部變量,函數外不可用,報錯i is not definedconsole.log(i)</script>
</body>

最后,作用域有一個坑:如果函數內部,變量沒有聲明,直接賦值,也當全局變量看,但是強烈不推薦

<body><script>function doSome() {// 不聲明,直接賦值num = 1}// 調用一下doSome()// 1,訪問成功console.log(num)</script>
</body>

5、變量的訪問原則

如下,輸出是20,首先兩個num作用域不同,并不沖突,其次,console.log打印時,num就近

在這里插入圖片描述

訪問原則:

  • 在能夠訪問到的情況下 先局部, 局部沒有在找全局,遵循就近原則
  • 如果函數中還有函數,那么在這個作用域中就又可以誕生一個作用域

在這里插入圖片描述

6、匿名函數

在這里插入圖片描述
函數定義完需要調用,匿名函數沒有名字,因此不能像具名函數一樣通過名字調用,其調用方式有兩種:

  • 函數表達式
  • 立即執行函數

6.1 函數表達式

語法是將匿名函數賦值給一個變量
在這里插入圖片描述

<body><script>let fn = function(num) {console.log('函數表達式的方式')}// 調用fn(1)</script>
</body>

這種寫法很像常規的具名函數定義,但有區別:

在這里插入圖片描述
在這里插入圖片描述

也就是說,具名函數的調用,可以寫在任何位置,而匿名函數用函數表達式來調用是不行的,因為函數表達式是一個let,最后,匿名函數的使用場景舉例:在Web API中

在這里插入圖片描述

在這里插入圖片描述

6.2 立即執行函數

寫法:拿個小括號包著匿名函數,最后再加個空的小括號,第二個小括號是在做調用,因此,這個函數一定義,匿名函數就立馬被執行了,因此,叫立即執行函數

在這里插入圖片描述

封號也可以寫前面,以下兩種寫法都行:

<body><script>(function () {console.log(1)})();(function () {console.log(2)})();</script>
</body>
// 封號寫前面
<body><script>; (function () {console.log(1)})(); (function () {console.log(2)})()</script>
</body>

立即執行函數還有個作用:防止變量污染

在這里插入圖片描述

再體會下,上面說的第二個小括號是在做調用

<body><script>(function (x, y) {console.log(x + y)})(1, 3);</script>
</body>

匿名函數的立即執行函數寫法,還有一種寫法,小括號里面包著匿名函數 + 一個空的小括號

在這里插入圖片描述

最后,多個立即執行函數要用 ; 隔開,要不然會報錯。未來其使用場景如:

在這里插入圖片描述

立即執行函數也可以有函數名,如下,寫成立即執行函數,一來不用再特地調用,二來,這個JS文件被引入后,即使JS中定義了變量,也不會引起變量污染

在這里插入圖片描述

7、練習

需求: 用戶輸入秒數,可以自動轉換為時分秒

<body><script>function convertTime(totalSecond = 0) {let hour = parseInt(totalSecond / 60 / 60 % 24)let minute = parseInt(totalSecond / 60 % 60)let second = parseInt(totalSecond % 60)// 補0,讓1小時變成01小時hour = hour < 10 ? '0' + hour : hourminute = minute < 10 ? '0' + minute : minutesecond = second < 10 ? '0' + second : secondreturn `${hour}${minute}${second}`}let totalSecond = +prompt('輸入總秒數')document.write(convertTime(totalSecond))</script>
</body>

此外,hour = hour < 10 ? '0' + hour : hour其實也體現了JS的弱類型,hour本身是數字型,最后重新賦值可能是一個String型,也沒報錯

8、邏輯中斷

通過左邊能得到整個式子的結果,因此沒必要再判斷右邊,即短路

在這里插入圖片描述

// 都是真,返回最后一個真值
console.log(11 && 22)	//22//邏輯或,返回最后一個真值
console.log(11 || 22)	//11

下面這個寫法,和給形參給默認值,效果一樣,x和y不傳時,為undefined,當false看,做邏輯與,就是0,最后結果為0 + 0

在這里插入圖片描述

未來短路運算的使用場景:

在這里插入圖片描述

注意??,和Java不同,JS的短路與和短路或 操作符返回的是操作數的值,而不是布爾值(true 或 false)

9、轉為布爾型

顯示轉換語法:

Boolean(內容)

''、0、undefined、null、false、NaN 轉換為布爾值后都是false, 其余則為 true

console.log(Boolean('hahhah'))  //true
console.log(Boolean(0))         //false
console.log(Boolean(NaN))       //false
console.log(Boolean(111))       //true

有了這個前提,再看

// null
console.log(null && 20) 

null當false看,那短路,結果是null,注意,返回是null,我沒加Boolean,下面這個返回才是false

//false
console.log(Boolean(null) && 20) 

在這里插入圖片描述

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

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

相關文章

硬件基礎--05_電壓

電壓(電勢差) 有了電壓&#xff0c;電子才能持續且定向移動起來&#xff0c;所有電壓是形成電流的必要條件。 電壓越大&#xff0c;能“定向移動”起來的電子就越多&#xff0c;電流就會越大。 有電壓的同時&#xff0c;形成閉合回路才會有電流&#xff0c;不是有電壓就有電流…

ES數據過多,索引拆分

公司企微聊天數據存儲在 ES 中&#xff0c;雖然按照企業分儲在不同的ES 索引中&#xff0c;但某些常用的企微主體使用量還是很大。4年中一個索引存儲數據已經達到46多億條數據&#xff0c;占用存儲3.1tb, ES 配置 由于多一個副本&#xff0c;存儲得翻倍&#xff0c;成本考慮…

存儲服務器是指什么

今天小編主要來為大家介紹存儲服務器主要是指什么&#xff0c;存儲服務器與傳統的物理服務器和云服務器是不同的&#xff0c;其是為了特定的目標所設計的&#xff0c;在硬件配置方式上也有著一定的區別&#xff0c;存儲空間會根據需求的不同而改變。 存儲服務器中一般會配備大容…

golang不使用鎖的情況下,對slice執行并發寫操作,是否會有并發問題呢?

背景 并發問題最簡單的解決方案加個鎖,但是,加鎖就會有資源爭用,提高并發能力其中的一個優化方向就是減少鎖的使用。 我在之前的這篇文章《開啟多個協程,并行對struct中的每個元素操作,是否會引起并發問題?》中討論過多協程場景下struct的并發問題。 Go語言中的slice在…

Java知識整理round1

一、常見集合篇 1. 為什么數組索引從0開始呢&#xff1f;假如從1開始不行咩 數組&#xff08;Array&#xff09;&#xff1a;一種用連續的內存空間存儲相同數據類型數據的線性數據結構 &#xff08;1&#xff09;在根據數組索引獲取元素的時候&#xff0c;會用索引和尋址公式…

【C++指針】搭建起程序與內存深度交互的橋梁(下)

&#x1f525;&#x1f525; 個人主頁 點擊&#x1f525;&#x1f525; 每文一詩 &#x1f4aa;&#x1f3fc; 往者不可諫&#xff0c;來者猶可追——《論語微子篇》 譯文&#xff1a;過去的事情已經無法挽回&#xff0c;未來的歲月還可以迎頭趕上。 目錄 C內存模型 new與…

JavaScript創建對象的多種方式

在JavaScript中&#xff0c;創建對象有多種方式&#xff0c;每種方式都有其優缺點。本文將介紹四種常見的對象創建模式&#xff1a;工廠模式、構造函數模式、原型模式和組合模式&#xff0c;并分析它們的特點以及如何優化。 1. 工廠模式 工廠模式是一種簡單的對象創建方式&am…

muduo庫的思路梳理

前言 對于muduo庫源碼的剖析我發現還是有些混亂的&#xff0c;所以這里再次梳理一下muduo網絡庫爭取可以簡單明了 首先對于muduo庫來說&#xff0c;不能想的得太過于復雜&#xff0c;它無非就是一個線程池加上epoll組成的網絡庫 這里我們從用的角度出發理解muoduo網絡庫 #inc…

Keil5 安裝全攻略

Keil5 安裝全攻略 Keil5 是一款廣泛用于嵌入式開發的 IDE&#xff0c;支持多種微控制器架構&#xff08;如 ARM、C51&#xff09;。本文將詳細介紹 Keil5 的安裝步驟、常見問題及解決方法&#xff0c;幫助您快速上手。 1. 安裝前的準備工作 (1) 系統要求 操作系統&#xff1…

C語言do...while語句將數字反轉后輸出

一、題目引入 輸入一個數字,將各位數字反轉后輸出? 參考代碼: 二、分析代碼 接著圖片中的分析 第一 ->a 的值變為12 第二 ->進入while循環條件,a為12不等于0循環才停止(a的值為12,顯然不等于0) 所以繼續進行循環 第三 ->此時b的值為12取各位上的數字(即2) 打印…

優選算法系列(前綴和 _下) k

目錄 五&#xff1a;和為 k 的子數組&#xff08;medium&#xff09; 題目鏈接&#xff1a;560. 和為 K 的子數組 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 代碼&#xff1a; 六&#xff1a;和可被 K 整除的子數組&#xff08;medium&#xff09; 題目鏈…

mac m3 pro 部署 stable diffusion webui

什么是Stable Diffusion WebUI &#xff1f; Stable Diffusion WebUI 是一個基于Stable Diffusion模型開發的圖形用戶界面&#xff08;GUI&#xff09;工具。通過這個工具&#xff0c;我們可以很方便的基于提示詞&#xff0c;描述一段文本來指導模型生成相應的圖像。相比較通過…

OpenCV圖像拼接(6)根據權重圖對源圖像進行歸一化處理函數normalizeUsingWeightMap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::normalizeUsingWeightMap 是 OpenCV 中用于圖像拼接細節處理的一個函數。它根據權重圖對源圖像進行歸一化處理&#xff0c;通常用于…

23種設計模式-外觀(Facade)設計模式

外觀設計模式 &#x1f6a9;什么是外觀設計模式&#xff1f;&#x1f6a9;外觀設計模式的特點&#x1f6a9;外觀設計模式的結構&#x1f6a9;外觀設計模式的優缺點&#x1f6a9;外觀設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是外觀設計模式…

capl語言基礎語法(二)

1.strncpy&#xff1a;將字符串復制到另一個字符串中。 輸入&#xff1a; dest 是目標字符串。 src 是源字符串。 n 是要復制的最大字符數。 語法&#xff1a; char *strncpy(char *dest, const char *src, size_t n); 例子&#xff1a; strncpy(gStringRep,"",…

QLoRA和LoRA 微調

QLoRA 其實是一種結合了量化和 LoRA 微調技術的統一方法&#xff0c;而不是同時使用兩種不同的微調方式。換句話說&#xff0c;QLoRA 的意思就是&#xff1a;先把大模型的主權重用低精度&#xff08;例如 4-bit&#xff09;量化&#xff0c;從而大幅減少存儲需求&#xff1b;然…

Qt Concurrent 并發 Map 和 Map-Reduce

并發 Map 和 Map-Reduce QtConcurrent::map()會對容器中的每個項目應用一個函數&#xff0c;對項目進行就地修改。QtConcurrent::mapped() 類似于 map()&#xff0c;但它返回的是一個包含修改內容的新容器。QtConcurrent::mappedReduced() 類似于 mapped()&#xff0c;只不過修…

RT-Thread-線程管理

一、線程管理 RT_Thread線程管理主要是實現線程管理和調度&#xff0c;線程分為用戶線程和系統線程。RT_Thread的線程調度器是搶占式的&#xff0c;尋找就緒狀態最高優先級線程。 線程管理的API函數 創建線程函數 rt_thread_t rt_thread_create( const char *name, //線程名稱 …

【CC2530 教程 十二】CC2530 Z-Stack 硬件抽象層

目錄 一、硬件抽象層簡介&#xff1a; &#xff08;1&#xff09;HAL 硬件抽象層是什么&#xff1f; &#xff08;2&#xff09;通俗易懂的解釋&#xff1a; &#xff08;3&#xff09;具體例子&#xff1a; 二、硬件抽象層HAL&#xff1a; &#xff08;1&#xff09;HAL…

Linux如何判斷磁盤是否已分區?

在 Linux 系統中&#xff0c;判斷磁盤是否已分區可通過以下方法實現&#xff1a; 方法 1&#xff1a;使用 fdisk -l 命令 此命令會列出所有磁盤及其分區的詳細信息&#xff1a; sudo fdisk -l輸出解讀&#xff1a; 若磁盤&#xff08;如 /dev/sdb&#xff09;下有類似 /dev/…