JavaScript 函式

在本教程中,你將學習如何在 JavaScript 中定義和呼叫函式。

什麼是功能?

函式是一組執行特定任務的語句,可以與主程式分開儲存和維護。函式提供了一種建立可重用程式碼的方法,這些程式碼包更易於移植且更易於除錯。以下是使用函式的一些優點:

  • 函式減少了程式中程式碼的重複 - 函式允許你將常用的程式碼塊提取到單個元件中。現在,你可以通過在指令碼中的任何位置呼叫此函式來執行相同的任務,而無需一次又一次地複製和貼上相同的程式碼塊。
  • 函式使程式碼更易於維護 - 由於建立一次的函式可以多次使用,因此在函式內部進行的任何更改都會在所有位置自動實現,而不會觸及多個檔案。
  • 函式可以更容易地消除錯誤 - 當程式細分為函式時,如果發生任何錯誤,你確切知道導致錯誤的函式以及在何處找到錯誤。因此,修復錯誤變得更加容易。

以下部分將向你展示如何在指令碼中定義和呼叫函式。

定義和呼叫函式

函式的宣告以 function 關鍵字開頭,後跟要建立的函式的名稱,後跟括號 () ,最後將函式的程式碼放在大括號 {} 之間。這是宣告函式的基本語法:

function functionName() {
    // Code to be executed
}

這是一個函式的簡單示例,它將顯示一條問候訊息:

// Defining function
function sayHello() {
    alert("Hello, welcome to this website!");
}
 
// Calling function
sayHello(); // 0utputs: Hello, welcome to this website!

定義函式後,可以從文件中的任何位置呼叫,方法是鍵入其名稱,後跟一組括號,如上例所示的 sayHello()

注意: 函式名稱必須以字母或下劃線字元開頭,而不是數字,可選地後跟更多的字母、數字或下劃線字元。函式名稱區分大小寫,就像變數名一樣。

向函式新增引數

定義函式以在執行時接受輸入值時,可以指定引數。引數的作用類似於函式中的佔位符變數; 它們在執行時被呼叫時提供給函式的值(稱為引數)替換。

引數在括號內的函式的第一行設定,如下所示:

function functionName( parameter1 , parameter2 , parameter3 ) { 
    // Code to be executed 
} 

以下示例中的 displaySum() 函式將兩個數字作為引數,只需將它們一起新增,然後在瀏覽器中顯示結果。

// Defining function
function displaySum(num1, num2) {
    var total = num1 + num2;
    alert(total);
}
 
// Calling function
displaySum(6, 20); // 0utputs: 26
displaySum(-5, 17); // 0utputs: 12

你可以根據需要定義任意數量的引數。但是,對於你指定的每個引數,在呼叫時需要將相應的引數傳遞給函式,否則其值將變為 undefined 。讓我們參考以下示例:

// Defining function
function showFullname(firstName, lastName) {
    alert(firstName + " " + lastName);
}
 
// Calling function
showFullname("Clark", "Kent"); // 0utputs: Clark Kent
showFullname("John"); // 0utputs: John undefined

函式引數的預設值 (ES6)

ES6 中可以為函式引數指定預設值。這意味著如果在呼叫時沒有為函式提供引數,則將使用這些預設引數值。這是 JavaScript 中最受期待的功能之一。這是一個例子:

function sayHello(name = 'Guest') {
    alert('Hello, ' + name);
}

sayHello(); // 0utputs: Hello, Guest
sayHello('John'); // 0utputs: Hello, John

在 ES6 之前,要達到同樣的目的,我們必須寫下這樣的程式碼:

function sayHello(name) {
    var name = name || 'Guest'; 
    alert('Hello, ' + name);
}

sayHello(); // 0utputs: Hello, Guest
sayHello('John'); // 0utputs: Hello, John

要了解其他 ES6 功能,請檢視 JavaScript ES6 功能章節。

從函式返回值

函式可以使用 return 語句將值返回給呼叫函式的指令碼。該值可以是任何型別,包括陣列和物件。

return 語句通常作為結束大括號之前的函式的最後一行放置,並以分號結束,如下例所示。

// Defining function
function getSum(num1, num2) {
    var total = num1 + num2;
    return total;
}
 
// Displaying returned value
alert(getSum(6, 20)); // 0utputs: 26
alert(getSum(-5, 17)); // 0utputs: 12

函式不能返回多個值。但是,你可以通過返回陣列來獲得類似的結果,如以下示例所示。

// Defining function
function divideNumbers(dividend, divisor){
    var quotient = dividend / divisor;
    var arr = [dividend, divisor, quotient];
    return arr;
}
 
// Store returned value in a variable
var all = divideNumbers(10, 2);
 
// Displaying individual values
alert(all[0]); // 0utputs: 10
alert(all[1]); // 0utputs: 2
alert(all[2]); // 0utputs: 5

使用函式表示式

我們在建立函式之前使用的語法稱為函式宣告。還有另一種建立函式的語法,稱為函式表示式。

// Function Declaration
function getSum(num1, num2) {
    var total = num1 + num2;
    return total;
}
 
// Function Expression
var getSum = function(num1, num2) {
    var total = num1 + num2;
    return total;
}

一旦函式表示式儲存在變數中,該變數就可以用作函式:

var getSum = function(num1, num2) {
    var total = num1 + num2;
    return total;
}
 
alert(getSum(5, 10)); // 0utputs: 15
 
var sum = getSum(7, 25);
alert(sum); // 0utputs: 32

注意: 在 JavaScript 中,函式可以儲存在變數中,作為引數傳遞給其他函式,作為返回值傳遞出函式,並在執行時構造。

函式宣告函式表示式的語法看起來非常相似,但它們的計算方式不同,請參閱以下示例:

declaration(); // Outputs: Hi, I'm a function declaration!
function declaration() {
    alert("Hi, I'm a function declaration!");
}
 
expression(); // Uncaught TypeError: undefined is not a function
var expression = function() {
    alert("Hi, I'm a function expression!");
}

正如你在前面的示例中所看到的,函式表示式在定義之前呼叫時引發了異常,但函式宣告已成功執行。

程式執行前的 JavaScript 解析宣告函式。因此,程式在定義之前呼叫函式並不重要,因為 JavaScript 已將函式提升到幕後當前作用域的頂部。在將函式表示式賦值給變數之前,不會對其求值; 因此,在呼叫時它仍然是未定義的。

ES6 為寫入函式表示式引入了更短的語法,稱為箭頭函式,請檢視 JavaScript ES6 功能章節以瞭解更多資訊。

瞭解可變範圍

但是,你可以在 JavaScript 中的任何位置宣告變數。但是,宣告的位置決定了 JavaScript 程式中變數可用性的範圍,即可以使用或訪問變數的位置。此可訪問性稱為可變範圍

預設情況下,在函式內宣告的變數具有區域性作用域,這意味著無法從該函式外部檢視或操作它們,如下例所示:

// Defining function
function greetWorld() {
    var greet = "Hello World!";
    alert(greet);
}
 
greetWorld(); // Outputs: Hello World!
 
alert(greet); // Uncaught ReferenceError: greet is not defined

但是,在函式外部的程式中宣告的任何變數都具有*全域性範圍,*即它將可用於所有指令碼,無論該指令碼是在函式內還是在外部。這是一個例子:

var greet = "Hello World!";
 
// Defining function
function greetWorld() {
    alert(greet);
}
 
greetWorld();  // Outputs: Hello World!
 
alert(greet); // Outputs: Hello World!