函數是可以被重複使用的代碼塊,它可以接受輸入參數,執行一系列操作,然後返回輸出結果。使用函數可以提高代碼的複用性,也可以將大問題拆解成小模塊,同時提高代碼的可維護行;

基本用法

  • 聲明函數的格式
function 函數名(參數名1: 類型, 參數名2: 類型): 返回值類型{
  ....
  return 返回值; 
}
  • 聲明函數示例
//例:聲明一個函數,接受兩個整數,然後返回兩個數的和;
function add(x:number, y: number): number{
  let z = x + y;
  return z;
}
  • 調用函數示例
let s1 = add(3, 4)	//調用add函數,求3與4的和,並把和值賦值給變量s
console.log("兩個數的和為:",s1)

let s2 = add(4, 6)	//重複調用add函數
console.log("兩個數的和為:",s2)

[!Warning]

調用函數時,必須滿足以下規則:

  • 聲明函數時()中的參數叫形式參數,調用函數時()中的參數叫實際參數。
  • 實際參數與形式參數必須滿足從左到右順序一致、類型匹配、數量相同,否則編譯報錯。
    let s2 = add(4, 6, 3) //編譯報錯

無返回值函數

函數可以沒有返回值,此時方法體內不需要寫return,返回值類型需要用void代替。

//聲明一個函數,接受兩個整數,執行求最和操作,直接和在函數內打印輸出
function max(x: number, y: number): void{
  let z = x + y;
  console.log("兩個數的和:",z)
}

//調用函數
max(3, 4)
max(4, 6)

無參數函數

根據需要函數可以沒有參數,此時()中什麼都不寫即可。

//聲明一個函數,打印輸出10個HarmonyOS Next
function print(){
  for(let i = 0; i < 10; i++){
    console.log(`HarmonyOS Next ${i}`)
  }
}

//調用函數
print();

返回類型推斷

在聲明函數時可以不明確指定返回值類型,可以根據return後面的結果自動推斷返回值類型。

// 通過結果自動推斷返回值數據類型
function sub(a: number, b: number) {
  return a + b;	//自動推斷結果為 number類型
}

let res = sub(10, 5)
//
console.log(typeof res)	// 輸出 number

箭頭函數

箭頭函數,又名Lambda表達式,它是一種比普通函數更加簡潔的函數寫法。

標準格式

let 函數名 = (參數列表): 返回值類型=>{
      函數的執行代碼
      return 結果
}

示例:聲明箭頭函數,求矩形的面積

//聲明箭頭函數
let rectArea = (width: number, height: number): number => { return width * height }

//調用箭頭函數
let s1: number = rectArea(100,50)

簡化格式

箭頭函數有以下幾種簡化寫法

  1. 箭頭函數的返回值類型可以省略,省略時返回值通過結果自動推斷。
//聲明箭頭函數
let rectArea = (width: number, height: number) => { return width * height }

//調用箭頭函數
let s1 = rectArea(100,50)
  1. 如果箭頭函數的函數體語句只有一條,{}、return也可以省略。
//聲明箭頭函數
let rectArea = (width: number, height: number) => width * height 

//調用箭頭函數
let s2 = rectArea(100,50)

箭頭函數作為參數使用

在實際使用時,通常將箭頭函數作為另一個函數的實際參數傳遞。

// Function 表示參數的數據類型是一個函數,調用`greet(...)`時,必須傳遞一個函數。
function greet(callback: Function) {
  callback();  // 調用回調函數
}

// 箭頭函數作為參數傳遞
greet(() => {
  console.log("Welcome!");
})

函數類型

通過type關鍵字可以定義類型別名,可以使用type將箭頭函數定義成數據類型。

//定義函數類型,只聲明函數,不實現函數
type Handler = (a: number, b: number) => number

//Handler作為參數的數據類型
function work(a:number, b: number, handler: Handler){
  return handler(a,b)
}

//調用work函數時,傳遞Handler函數的實現方式
let result1 = work(3, 4,(a,b)=>{return a+b})
console.log(`${result1}`)  //7

let result2 = work(3, 4,(a,b)=>{return a*b})
console.log(`${result2}`)  //12

可選參數

在參數名稱後面加上?表示參數是可選的,意思就是調用時可以傳遞參數,也可以不傳遞參數。

//定義函數,構建姓名
function buildName(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName + "富貴";
}
 
let result1 = buildName("李");  // 正確
let result2 = buildName("李", "世明");  // 正確

可變參數

函數的最後一個參數可以是可變參數,格式為...restArgs。可變參數允許函數接收一個由剩餘實參組成的數組,類型為任意指定類型,用於處理不定數量的參數輸入。

// 需求:定義函數,求任意幾個數據的和
function sum(...numbers: number[]): number {
  let sum = 0;
  for (let num of numbers) {
    sum += num;
  }
  return sum;
}

// 調用函數,傳入任意數量的參數  
let res1 = sum(1, 2, 3)
console.log(`${res1}`)	//輸出 6
let res2 = sum(1, 2, 3, 4, 5, 6)
console.log(`${res2}`)	//輸出 21

感興趣的同學可以嘗試考取 鴻蒙開發者認證