天天看點

apply,call,bind的基本使用

apply()、call()、bind()有什麼用?

作用:都用可以用于改變函數中this的指向;

apply()、call()的差別

function Person (name,age) {
    console.log(this + "name:" + name + "age:" + age)
}


/*************************call()的使用********************************/
function Student (name,age) {
    //如果Student想使用Person的方法,需要改變Person方法this的指向;
    //用法:  方法.call(this/null, 參數1, 參數2, ...)
    Person.call(this, name, age)  
}


Student('小白', 18)
//[object Window]  name:小白age:18

//這樣就成功用Student調用了Person的方法


/*************************apply()的使用********************************/
function Student (name,age) {
    //如果Student想使用Person的方法,需要改變Person方法this的指向;
    //用法:  方法.apply(this/null, [參數1, 參數2, ...])
    Person.call(this, name, age)  
}


Student('小白', 18)
//[object Window]  name:小白age:18
           

這樣就成功用Student調用了Person的方法,實際上也算是借用構造函數。可以通過這個管道實作繼承。(Student繼承Person)

但是要注意的是如果你列印函數Student,會發現裡面是沒有這個方法的,隻是借用了這個方法。

總結:apply()、call()實際上完成的任務是一樣的,隻是習慣不同,會喜歡使用不同的函數。它們的不同點在于他們的參數設定

           call的用法是:   方法名字(或者是原型/對象的方法).call(this/null, 參數1, 參數2, ...)

           apply的用法是:   方法名字(或者是原型/對象的方法).apply(this/null, [參數1, 參數2, ...])

這時候存在一個問題我使用方法時使用的第一個參數 this/null到底有什麼差別?

apply和call方法中如果沒有傳入參數,或者是傳入的是null,那麼調用該方法的函數對象中的this就是預設的window;除非有對象調用這個方法;

function Person (name,age) {
    console.log(this)
}

var obj = {};
Person.call(obj, '大白', 22) //{}

//假如我使用構造函數的執行個體化對象(new的對象)調用,注意構造函數的this就是執行個體化對象的本身。
function Student () {};
var stu = new Student();
Person.call(stu, '二白', 21) // Student(){}  ,列印出他的構造函數!
Person.call(null, '二白', 21) // windows
           

那麼之前第一個例子中直接再構造函數中使用Person.call(this, '小白', 18),中的this是window是由于構造函數中的this就是window,是以我們在指派的時候會把this(window)賦予給Person中的this。是以列印出window;

但是當我們把第一個值設定為null的時候系統會預設把this賦予給window。

總結:我們在apply(),call(),第一個參數中賦予的對象決定了被調用函數(Person)的this。

bind()的使用

bind()和apply()、call()的差別在于後者是直接調用,前者會把他複制為一個函數。不會直接調用

function Person (name) {
    console.log(this + 'name' + name);
}

Person.call(this,'三白') //直接執行;

var ff = Person.bind(this,'三白') //指派到ff中,并沒有調用;
ff()//此時才執行;
           

那麼這個bind()的作用就在于有些不需要直接執行的地方,例如事件函數啊,setTimeout啊,setInterval啊這一些地方。

以上就是他們的使用和差別啦。對了經過測試在平常的使用forEach()會比for的效率要高的多。有毛有特色情況麻煩提一下