真的是非常簡單的理解,我知道的並不多,在網上查找了很多的資料,還是只能了解一點皮毛,下面來整理出來,方便以后深入的去學習,也是對目前知道的知識點的鞏固。
整理一些網上的經典解答:
1.一句話區分call 和apply
obj1.call(obj2,arg1,arg2,arg3) == obj1.apply(obj2,arguments) == obj2.foo(arg1,arg2,arg3)
thisA.functionA.apply(thisB,[arg1,arg2,...]) == thisA.functionA.call(thisB,arg1,arg2,...) == thisB.functionA(arg1,arg2,...)
- obj2如果為空則this指向window對象
- call 和apply的區別在於:call接的參數是固定的,按照順序輸入。apply接收的參數是一個數組。
- 什么時候使用call或者apply?當參數是固定的時候一般使用call,如果參數不確定或者參數是一個數組時需要使用apply.
- 上面的話理解成 obj2調用obj1的方法。對象thisB調用thisA的functionA方法
2.理解obj2如果為空則this指向window
1 obj1.call(obj2,a,b); 2 //等價於 3 if(obj2!==null){ 4 obj1.this=obj2; 5 }else{ 6 obj1.this=window; 7 } 8 obj1(a,b);
3.摘自javascript高級程序書本中的代碼
1 var values = [1,2,3,4,5,6,9]; 2 var max = Math.max.apply(Math,values); 3 console.log(max);//9
這里Math當作apply()的第一個參數我無法理解,max()方法是Math對象下面的一個方法,values為一個數組對象,需要去借用Math對象下面的max()方法。
1 var values = [1,2,3,4,5,6,9]; 2 var max = Math.max.apply(Array,values); 3 console.log(max);//9
1 var values = [1,2,3,4,5,6,9]; 2 var max = Math.max.apply(this,values); 3 console.log(max);//9
發現用Array或者this代替 Math盡然都會輸出9.
4.一個例子
call和apply可以用來重新定義函數的執行環境,也就是this的指向
1 function changgeStyle(attr,value){ 2 this.style[attr] = value; 3 } 4 var box = document.getElementById("box"); 5 window.changgeStyle.call(box,"height","200px");
changgeStyle()為window對象下面的方法,那么如何把window對象的方法轉移到box對象上呢,通過動態的改變this的指向,也就是相當於借用window.changgeStyle()的方法,通過call方法把 window.changgeStyle("height","200px")變成了box.changgeStyle("height","200px").
總結:就是自己沒有的屬性或者方法,通過改變函數的執行環境(this的指向),或者通俗點來說就是借用別人的屬性或者方法來執行操作。
