對call() apply() 方法的簡單理解


  真的是非常簡單的理解,我知道的並不多,在網上查找了很多的資料,還是只能了解一點皮毛,下面來整理出來,方便以后深入的去學習,也是對目前知道的知識點的鞏固。

整理一些網上的經典解答:

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的指向),或者通俗點來說就是借用別人的屬性或者方法來執行操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM