call apply bind

每一個函數都包含兩個非繼承而來的方法call() apply()javascript

用途:在特定的做用域中調用函數,實際等於設置函數體內this對象的值java


  1. apply call

apply方法接收兩個參數:在其中運行函數的做用域 參數數組數組

第二個參數能夠是Array的實例,也能夠是arguments對象app

第一個參數是null undefined 指向window global 
(嚴格模式指向 null undefined)函數

function sum(num1, num2) {
    return num1 + num2;
}

function sum1(num1, num2) {
    return sum.apply(this, arguments);
    //傳入arguments對象
}

function sum2(num1, num2) {
    return sum.call(this, [num1, num2]);
    //傳入數組
}

sum1(10, 10); //20
sum2(10, 10); //20

 

 

sum1在執行sum函數時傳入this,在全局中調用那麼this就指向window 
可是在嚴格模式下,沒有指定環境對象而調用函數,this不會指向window 而是undefined,除非把函數添加到某個對象或者調用apply callthis

 function sum3(num1, num2) { 
 return sum.call(this, num1, num2); 
} //20 

 

使用apply 仍是call 取決於你採起哪一種給函數傳遞參數的方式最方便spa

除了傳遞參數,他們可以擴充函數賴以運行的做用域code

window.o = 'red';
var o = { color: 'blue'};

function sayColor() {
    alert(this.color);
}

sayColor(); //red
sayColor.call(this);  //red
sayColor.call(window); //red
sayColor.call(o);  //blue

 

 //全局做用域下是red,而若是是指向了o,那麼就是blue

2.bind對象

這個方法會建立一個函數的實例,其this值會被綁定到傳給bind函數的值blog

window.o = 'red';
var o = {
    color: 'blue';
}

function sayColor() {
    alert(this.color);
}

var sayColor1 = sayColor.bind(o);
sayColor1();
//blue

 

 

使用bind則會被綁定,即便使用call apply也沒法修改

相關文章
相關標籤/搜索