每一個函數都包含兩個非繼承而來的方法call() apply()javascript
用途:在特定的做用域中調用函數,實際等於設置函數體內this對象的值java
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也沒法修改