改變函數內部this指針的指向函數:
通過apply和call改變函數的this指向,他們兩個函數的第一個參數都是一樣的表示要改變指向的那個對象,第二個參數,apply是數組,而call則是arg1,arg2...這種形式。通過bind改變this作用域會返回一個新的函數,這個函數不會馬上執行。
call()和appl()的理解
每個函數都包含兩個非繼承而來的方法:apply()和call()
1.這兩個方法的用途:在特定的作用域中調用函數,實際上等於設置函數體內this對象的值
(1)apply()方法接收兩個參數:一個是在其中運行函數的作用域,里一個是參數數組(Array的實例或者arguments對象)
function sum(num1,num2){
return num1 + num2
}
function callSum(num1,num2){
return sum.apply(this,arguments);
}
alert(callSum(10,10));//20
callSum()在執行sum()函數時傳入了this作為this值(因為是全局調用的,所有傳入的就是window對象)和arguments對象
(2)call()方法與apply()的作用相同,區別在於接受參數的方式不同,call第一個參數是this值沒有變化,變化的是其余參數都直接傳給函數。
function sum(num1,num2){
return num1 + num2
}
function callSum(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum(10,10));//20
2.apply()和call()真正強大的地方是能擴充函數賴以運行的作用域。
window.color = "red"
var o = {color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue(就算此時再sayColor函數里面添加 var color = “red”,結果仍然是blue,因為sayName函數體內的this已經指向o了)
解釋:sayColor()作為全局函數定義,當在全局作用域中調用它時,就會顯示red;sayColor.call(this)中的this就是wimdow,和sayColor.call(window)一樣,都是在全局作用域中調用sayColor(),結果還是會顯示‘red’,
但是當運行sayColor.call(o)時,函數的執行環境就不一樣了,因為此時函數體內的this對象指向了o,結果是顯示blue
使用call()和apply來擴充作用域的最大好處就是不需要與方法有任何耦合關系
