call、apply和bind方法

1. call和apply

call和apply方法很是類似,都是先設置函數中的this操做符的值,而且執行這個函數。

區別:數組

  1. apply以數組形式接受傳遞給函數的參數
  2. call以單個分開參數的形式

例子:app

class Person {
    public name: string;
    public surname: string;
    
    constructor(name: string, surname: string) {
        this.name = name;
        this.surname = surname;
    }
    
    public greet(city: string, country: string) {
        // 使用this操做符訪問實例的name和surname屬性
        var msg = `Hi, my name is ${this.name} ${this.surname}. `;
        msg += `I'm from ${city} (${country}).`;
        console.log(msg);
    }
}


var person = new Person("Fourteen", "Zhang");

person.greet("Shijiazhuang", "China");
// Hi, my name is Fourteen Zhang. I'm from Shijiazhuang (China).

// 經過call和apply函數調用該方法
person.greet.call(person, "Shijiazhuang", "China");
person.greet.apply(person, ["Shijiazhuang", "China"]);

var valueOfThis = { name: "Fourteen", surname: "Zhang" };
person.greet.call(valueOfThis, "Shijiazhuang", "China");
person.greet.apply(valueOfThis, ["Shijiazhuang", "China"]);
// Hi, my name is Fourteen Zhang. I'm from Shijiazhuang (China).

2. bind

bind方法也能夠設置this操做符的值,但不執行它。

注意:函數

  1. 調用函數的bind方法時,返回一個和原函數具備相同函數體和做用域的新函數
  2. 函數體內部的this操做符指向的值,已被永久地改變爲傳遞給bind方法的第一個參數,不會改變

例子:this

var person = new Person("Fourteen1", "Zhang");

var greet = person.greet.bind(person);

greet.call(person, "Hebei", "China");
greet.apply(person, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I'm from Shijiazhuang (China).

greet.call(null, "Hebei", "China");
greet.apply(null, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I'm from Hebei (China).

var valueOfThis = { name: "Fourteen2", surname: "Zhang" };
greet.call(valueOfThis, "Hebei", "China");
greet.apply(valueOfThis, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I'm from Hebei (China).

一旦使用bind方法爲一個函數內的this操做符進行了綁定,就不能再覆蓋它:code

var valueOfThis = { name: "Fourteen3", surname: "Zhang" };

var greet = person.greet.bind(valueOfThis);
greet.call(valueOfThis, "Hebei", "China");
greet.apply(valueOfThis, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I'm from Hebei (China).
相關文章
相關標籤/搜索