回覆列表
  • 1 # 使用者52510796211

    Javascript的每個Function物件中有一個apply方法:function.apply([thisObj[,argArray]])還有一個類似功能的call方法:function.call([thisObj[,arg1[,arg2[,[,.argN]]]]])它們各自的定義:apply:應用某一物件的一個方法,用另一個物件替換當前物件。call:呼叫一個物件的一個方法,以另一個物件替換當前物件。它們的共同之處:都“可以用來代替另一個物件呼叫一個方法,將一個函式的物件上下文從初始的上下文改變為由thisObj指定的新物件。”它們的不同之處:apply:最多隻能有兩個引數——新this物件和一個數組argArray。如果給該方法傳遞多個引數,則把引數都寫進這個數組裡面,當然,即使只有一個引數,也要寫進數組裡面。如果argArray不是一個有效的陣列或者不是arguments物件,那麼將導致一個TypeError。如果沒有提供argArray和thisObj任何一個引數,那麼Global物件將被用作thisObj,並且無法被傳遞任何引數。call:則是直接的引數列表,主要用在js物件各方法互相呼叫的時候,使當前this例項指標保持一致,或在特殊情況下需要改變this指標。如果沒有提供thisObj引數,那麼Global物件被用作thisObj。更簡單地說,apply和call功能一樣,只是傳入的引數列表形式不同:如func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3])也就是說:call呼叫的為單個,apply呼叫的引數為陣列functionsum(a,b){console.log(this===window);//trueconsole.log(a+b);}sum(1,2);sum.call(null,1,2);sum.apply(null,[1,2]);作用  a、呼叫函式varinfo="tom";functionfoo(){//this指向windowvarinfo="jerry";console.log(this.info);//tomconsole.log(this===window)//true}foo();foo.call();foo.apply();b、call和apply可以改變函式中this的指向  varobj={info:"spike"};foo.call(obj);//這裡foo函數里面的this就指向了objfoo.apply(obj);c、借用別的物件的方法求陣列中的最大值vararr=[123,34,5,23,3434,23];//方法一vararr1=arr.sort(function(a,b){returnb-a;});console.log(arr1[0]);//方法二varmax=Math.max.apply(null,arr)//借用別的物件的方法console.log(max);

  • 中秋節和大豐收的關聯?
  • 夢幻西遊手遊化生孩子怎麼培養?