n2dev

JavaScript call() apply() bind() メソッドの違い

2024-08-09

call()

関数内のthisの参照先を指定することができます。

例1

fullInfo関数内のthisはpersonを参照していますが、call()を使用することに寄って、その参照先を変更することができます。

const person = {
    name: "Mike",
    age: 30,
    fullInfo: function() {
        return this.name + " is " + this.age + " years old."
    }
}

const person1 = {
    name: "Tanaka",
    age: 25
}

const person2 = {
    name: "John",
    age: 43
}

console.log(person.fullInfo())
console.log(person.fullInfo.call(person1))
console.log(person.fullInfo.call(person2))

// 出力
> Mike is 30 years old.
> Tanaka is 25 years old.
> John is 43 years old.

例2

call()メソッドの第2引数以降に、関数に渡す引数を指定することができます。

const personInfo = function(location, job) {
    return this.name + " is " + this.age + " years old, from " + location + " and work as a " + job + "."
}

const person1 = {
    name: "Tanaka",
    age: 25
}

console.log(personInfo.call(person1, "Tokyo", "Web Developer"))

// 出力
> Tanaka is 25 years old, from Tokyo and work as a Web Developer.

apply()

call()メソッドとほぼ同じですが、関数に渡す引数を配列で指定することができます。

例1

const personInfo = function(location, job) {
    return this.name + " is " + this.age + " years old, from " + location + " and work as a " + job + "."
}

const person1 = {
    name: "Tanaka",
    age: 25
}

console.log(personInfo.apply(person1, ["Tokyo", "Web Developer"]))

// 出力
> Tanaka is 25 years old, from Tokyo and work as a Web Developer.

例2

Math.min()は通常、引数に配列を渡すことができませんが、apply()を使うことによって、引数を渡すことができるようになります。

console.log(Math.min(6, 4, 11))

// 出力
> 4

const numbers = [6, 4, 11]
console.log(Math.min.apply(null, numbers))

// 出力
> 4

※ただし、これは旧来の書き方であり、現在は以下のように書くことが多いです。

console.log(Math.min(...numbers))

// 出力
> 4

bind()

call()メソッドはその場で実行されましたが、bindメソッドは新しい関数を作成することができます。

例1

const personInfo = function(location, job) {
    return this.name + " is " + this.age + " years old, from " + location + " and work as a " + job + "."
}

const person1 = {
    name: "Tanaka",
    age: 25
}

const bound = personInfo.bind(person1)
console.log(bound("Tokyo", "Web Developer"))

// 出力
> Tanaka is 25 years old, from Tokyo and work as a Web Developer.