JS學習筆記#26 | 函數方法(Function Methods)

更新於 發佈於 閱讀時間約 6 分鐘

一、簡介

在 JavaScript 中,函數是物件,因此它們有內建方法可以用來控制執行方式。

這些方法包括 .call().apply().bind(),主要用來改變函數執行時的 this 指向或傳遞參數,特別在物件導向或繼承中很有用。


二、主要函數方法

1. .call(thisArg, arg1, arg2, ...)

立即執行函數,並指定 this 的值,參數逐個傳入。

function greet(greeting) {
console.log(`${greeting}, I'm ${this.name}`);
}

const person = { name: "Alice" };
greet.call(person, "Hello"); // "Hello, I'm Alice"

解析

  • thisArg:指定 this 指向 person。
  • arg1:傳入 "Hello" 作為 greeting。


實際應用:借用其他物件的方法

const person1 = { 
name: "Alice",
greet: function() {
console.log(`Hi, ${this.name}`);
}
};
const person2 = { name: "Bob" };
person1.greet.call(person2); // "Hi, Bob"


2..apply(thisArg, [args])

與 .call() 類似,立即執行函數並指定 this,但參數以陣列形式傳入。

function introduce(greeting, time) {
console.log(`${greeting}, I'm ${this.name}, it's ${time}`);
}

const person = { name: "Bob" };
introduce.apply(person, ["Hey", "morning"]); // "Hey, I'm Bob, it's morning"

解析

  • thisArg:this 指向 person。
  • [args]:陣列 ["Hey", "morning"] 分解為 greeting 和 time。

與 .call() 的差異

  • .call():逐個傳參(arg1, arg2, ...)。
  • .apply():參數用陣列([arg1, arg2, ...])。


實際應用:處理動態參數

const numbers = [1, 2, 3, 4];
console.log(Math.max.apply(null, numbers)); // 4


3. .bind(thisArg, arg1, arg2, ...)

不立即執行,而是返回一個新函數,永久綁定指定的 this 和部分參數。

function sayHello(greeting) {
console.log(`${greeting}, I'm ${this.name}`);
}

const person = { name: "Charlie" };
const boundFn = sayHello.bind(person, "Hola");
boundFn(); // "Hola, I'm Charlie"

解析

  • thisArg:this 永久綁定到 person。
  • arg1:預設 "Hola" 作為 greeting。
  • 返回新函數,可後續調用。


與 .call() / .apply() 的差異

  • .call() 和 .apply() 立刻執行,.bind() 只綁定不執行。


實際應用:事件處理

const obj = {
name: "Dog",
bark: function() {
console.log(`${this.name} says woof`);
}
};

const boundBark = obj.bark.bind(obj);
setTimeout(boundBark, 1000); // 1秒後 "Dog says woof"


三、注意事項

1. .call() 和 .apply() 的 thisArg 若為 null 或 undefined:

在非嚴格模式下,this 指向全域物件(window 或 global)。

在嚴格模式下,this 保持 null 或 undefined。

"use strict";
function checkThis() {
console.log(this);
}
checkThis.call(null); // null


2..bind() 的綁定是永久的

後續無法用 .call() 或 .apply() 改變 this

const bound = sayHello.bind({ name: "Fixed" });
bound.call({ name: "New" }); // "Hola, I'm Fixed"(不會變成 New)


3.效能考量:

.bind() 創建新函數,若大量使用可能增加記憶體負擔。


四、小結

.call():立即執行,指定 this,逐個傳參。

.apply():立即執行,指定 this,陣列傳參。

.bind():返回新函數,綁定 this 和部分參數。

用途:控制 this,實現方法借用或繼承。





avatar-img
0會員
28內容數
留言
avatar-img
留言分享你的想法!
koko的沙龍 的其他內容
每個建構函數都有 prototype 屬性,是一個物件,用來存放共享的方法或屬性。 物件透過 __proto__ 連接到其原型,形成屬性和方法的查找路徑。
建構函數是 JavaScript 中用來創建和初始化物件的一種特殊函數。它像一個「模具」,透過 new 關鍵字生成多個相似的物件實例。
遞迴是指一個函數自己呼叫自己,用來解決可以分解成相似小問題的大問題。它就像一層層深入,最後再一層層回來的過程。
調用棧是 JavaScript 引擎用來管理函數執行的一種資料結構。 它就像一個垂直的待辦清單,追踪當前正在執行的函數,以及它們的順序。 核心特點 遵循「後進先出」(LIFO, Last In First Out)的規則。 每個函數調用會被「推入」
閉包是指一個函數能夠「記住」它被創建時的外部環境(作用域),即使那個外部環境已經不存在了。 簡單來說,閉包就像是函數帶著一個「記憶背包」,裡面裝著它出生時能看到的變數。
作用域是指程式中變數的可訪問範圍,也就是變數在哪裡可以被存取。 JavaScript 有幾種作用域類型: 1.全域作用域(Global Scope) 變數在程式最外層定義,任何地方都可以存取。 var globalVar1 = "我是全域的1"; let globalV
每個建構函數都有 prototype 屬性,是一個物件,用來存放共享的方法或屬性。 物件透過 __proto__ 連接到其原型,形成屬性和方法的查找路徑。
建構函數是 JavaScript 中用來創建和初始化物件的一種特殊函數。它像一個「模具」,透過 new 關鍵字生成多個相似的物件實例。
遞迴是指一個函數自己呼叫自己,用來解決可以分解成相似小問題的大問題。它就像一層層深入,最後再一層層回來的過程。
調用棧是 JavaScript 引擎用來管理函數執行的一種資料結構。 它就像一個垂直的待辦清單,追踪當前正在執行的函數,以及它們的順序。 核心特點 遵循「後進先出」(LIFO, Last In First Out)的規則。 每個函數調用會被「推入」
閉包是指一個函數能夠「記住」它被創建時的外部環境(作用域),即使那個外部環境已經不存在了。 簡單來說,閉包就像是函數帶著一個「記憶背包」,裡面裝著它出生時能看到的變數。
作用域是指程式中變數的可訪問範圍,也就是變數在哪裡可以被存取。 JavaScript 有幾種作用域類型: 1.全域作用域(Global Scope) 變數在程式最外層定義,任何地方都可以存取。 var globalVar1 = "我是全域的1"; let globalV
你可能也想看
Google News 追蹤
Thumbnail
全方位分析脫離繼承戰的方法,大膽猜測誰會成為卡丁國下一任國王。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
主要來講宣告函式跟箭頭函式 : 宣告函式(Function Declaration) 語法: function functionName(parameters) { return result; } 特點: 使用 function 關鍵字 函式名稱是必需的 存在函式
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
在之前的文章當中曾經提到過 JavaScript 中的物件有一個特別的機制:傳參考(Called by reference),如果正確性再高一點的話,則可以稱之為傳共享(Called by sharing)。
Thumbnail
全方位分析脫離繼承戰的方法,大膽猜測誰會成為卡丁國下一任國王。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
主要來講宣告函式跟箭頭函式 : 宣告函式(Function Declaration) 語法: function functionName(parameters) { return result; } 特點: 使用 function 關鍵字 函式名稱是必需的 存在函式
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
在之前的文章當中曾經提到過 JavaScript 中的物件有一個特別的機制:傳參考(Called by reference),如果正確性再高一點的話,則可以稱之為傳共享(Called by sharing)。