函式是一種模組化、可重複使用的陳述式區塊,可用於執行一組 相關工作,例如根據引數計算及傳回值 提供給函式與所有非原始值一樣, 函式是物件是不重複的物件,可以呼叫這些物件 以便執行程式碼,並以引數的形式傳遞資料, 然後傳回值。
函式會視為「第一類別」 代表儘管它們的獨特行為, 與其他 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
在嚴格模式中,函式宣告
範圍限定在其最接近的封閉區塊,就像使用
let
或 const
:
"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`
``