函式

函式是一種模組化、可重複使用的陳述式區塊,可用於執行一組 相關工作,例如根據引數計算及傳回值 提供給函式與所有非原始值一樣, 函式是物件是不重複的物件,可以呼叫這些物件 以便執行程式碼,並以引數的形式傳遞資料, 然後傳回值。

函式會視為「第一類別」 代表儘管它們的獨特行為, 與其他 JavaScript 物件相同舉例來說,函式可以是 以引數的形式傳遞至其他函式 其他函式會互相干擾

function myFunction() {
   console.log( "This is my function." );
};

定義為物件屬性的函式是由 通常稱為「方法」就像使用 var 宣告的變數一樣, 在封閉函式以外發出的函式宣告會新增到 全域物件做為方法。

函式宣告

函式宣告 (也稱為「函式陳述式」或「函式定義」) 建立已命名函式,可在包含範圍中的其他位置叫用。 函式宣告包含 function 關鍵字,後接 識別碼、以括號括住的逗號分隔參數清單,以及 名為「區塊陳述式」的 「函式主體」您可能會經常遇到沒有 以半形分號結尾因為函式宣告是陳述式 分號可用 ASI 推測。

function myFunction() {
   console.log( "This is my function." );
};

myFunction();
> "This is my function."

做為 JavaScript 早期設計決策的保留,函式宣告 都適用相同的舊版提升 行為視為使用 var 宣告的變數,意味著函式宣告 提升至其範圍頂端,並可在宣告為 結果,該範圍是否受嚴格模式規範:

"use strict";
{
    myFunction();
    function myFunction() {
        console.log( "This is my function." );
    };
}
> "This is my function."

嚴格模式以外,函式 宣告會使用 JavaScript 的舊版範圍設定 表示函式宣告的範圍僅限於其最接近外圍 函式:

function myFunction() {
    function myNestedFunction() {
        console.log( "This is my nested function." );
    }
    myNestedFunction();
};

myFunction();
> "This is my nested function."

myNestedFunction();
>Uncaught ReferenceError: myNestedFunction is not defined

嚴格模式中,函式宣告 範圍限定在其最接近的封閉區塊,就像使用 letconst

"use strict";
{
    function myFunction() {
        console.log( "This is my function." );
    };
}

myFunction();
> Uncaught ReferenceError: myFunction is not defined

函式呼叫

和變數一樣,宣告函式時使用的 ID 就具有以下功能: 符號的名稱。只透過 ID 參照函式,會傳回以下結果 僅做為函式物件,但不會執行其中所含的函式:

function myFunction() {
   console.log( "This is my function." );
};

myFunction;
> myFunction() {
   console.log( "This is my function." );
}

如要在函式主體中執行程式碼,請呼叫 (或 invoke) 函式。 方法是在函式名稱後方加上一組相符的括號:

function myFunction() {
    console.log( "My function has been executed." );
}

myFunction();
> "My function has been executed."

函式定義中的參數可做為 呼叫函式時,該值可傳遞至函式主體。 呼叫函式時,括號中的值是「引數」(但 您可能會看到「引數」用來描述部分 說明文件):

function myFunction( myParameter ) {
   console.log( `The value is: ${ myParameter }.` );
};

myFunction( "this string" );
> "The value is: this string."

如果省略預期的引數,則產生的參數會包含 undefined 值,因為此參數宣告為函式主體,但 沒有透過值初始化:

function myFunction( myParameter ) {
   console.log( `The value is: ${ myParameter }.` );
};

myFunction();
> "The value is: undefined."

如要設定預設參數值,請按照 初始化變數:一個指派運算子 (=),後面接著一個值。如果發生以下情況: 稍後為該函式指定引數,新的值會覆寫 預設值:

function myFunction( myParameter = "omitted" ) {
   console.log( `The value is: ${ myParameter }.` );
};

myFunction( "this string" );
> "The value is: this string."

myFunction();
> "The value is: omitted."

非箭頭的主體 函式也能存取 0 索引 類似 陣列arguments 物件 包含任何做為引數傳遞的值 (無論函式是否位於) 定義會指定參數:

function myFunction() {
   console.log( arguments );
};

myFunction( 3, true, "My string" );
> Arguments { 0: 3, 1: true, 2: "My string", … }

血管函式

arguments 物件可讓您建立基本的口腔函式,而該函式可 接受變數數量的引數

function myFunction() {
    let result = "";
    for (let i = 0; i < arguments.length; i++) {
        result += arguments[i] + " - ";
    }
    console.log( result );
};

myFunction( "My first string", "My second string", "my third string" );\
> "My first string - My second string - my third string - "

然而,此方法在現代 JavaScript 中鮮少使用這種函數 。常見的做法是使用較新、容易理解的 這會建立一個具名參數,並將該參數初始化為包含任何引數的陣列 超額指定的 IP 範圍:

function myFunction( mySeparator, ...myStrings ) {
  console.log( myStrings.join( mySeparator ) );
};

myFunction( " - ", "My first string", "My second string", "my third string" );
> "My first string - My second string - my third string"

parameter 繫結不同,剩餘參數語法可搭配箭頭函式參數正常運作:

function myOuterFunction() {
    let myInnerArrowFunction = ( ...myParams ) => {
        console.log( myParams[ 0 ] );
    }
    myInnerArrowFunction( true );
};

myOuterFunction( false );
> true

let myArrowFunction = ( ...myParams ) => {
    console.log( myParams[ 0 ] );
};

myArrowFunction( true );
> true`
``