The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          apply and call

             它們的作用都是將函數綁定到另外一個對象上去運行,兩者僅在定義參數方式有所區別:

              apply(thisArg,argArray);

              call(thisArg[,arg1,arg2…] ]);

          即所有函數內部的this指針都會被賦值為thisArg,這可實現將函數作為另外一個對象的方法運行的目的

          apply的說明

                 如果 argArray 不是一個有效的數組或者不是 arguments 對象,那么將導致一個 TypeError。 
          如果沒有提供 argArray 和 thisArg任何一個參數,那么 Global 對象將被用作 thisArg, 
          并且無法被傳遞任何參數。

          call的說明

                call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisArg指定的新對象。 
          如果沒有提供 thisArg參數,那么 Global 對象被用作 thisArg

          相關技巧:

               應用call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(類)以后,當前的 
          函數(類)就具備了另一個函數(類)的方法或者是屬性,這也可以稱之為“繼承”。
          看下面示例:

          // 繼承的演示 
           function base() { 

              this.member = "我是基類的屬性!"
              
          this.method = function() { 
                  window.alert(
          "我是基類method方法!"); 
              } 

          function extend() { 
              base.call(
          this); 
              window.alert(member); 
              window.alert(
          this.method); 
               
          this.me = "擴展出來的新屬性";
               alert(
          this.me);
          }
          extend();

          上面的例子可以看出,通過call之后,extend可以繼承到base的方法和屬性。



          call 方法 

          調用一個對象的一個方法,以另一個對象替換當前對象。 

          call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 

          參數 

          thisObj 

          可選項。將被用作當前對象的對象(替代當前對象的對象)。 

          arg1, arg2, , argN 

          可選項。將被傳遞方法參數序列(傳遞給替代對象的參數列表)。 

          說明 

          call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。 

          如果沒有提供 thisObj 參數,那么 Global 對象被用作 thisObj。 


          說明白一點其實就是更改對象的內部指針,即改變對象的this指向的內容。這在面向對象的js編程過程中有時是很有用的。 

          引用網上一個代碼段,運行后自然就明白其道理。 

           <input type="text" id="myText" value="input text"> 

           function Obj(){this.value="對象!";} 

          var value="global 變量"
          function Fun1(){alert(this.value);} 
          window.Fun1(); 
          //global 變量 
          Fun1.call(window); //global 變量 
          Fun1.call(document.getElementById('myText')); //input text 
          Fun1.call(new Obj()); //對象!


          call函數和apply方法的第一個參數都是要傳入給當前對象的對象,及函數內部的this。后面的參數都是傳遞給當前對象的參數。 

          運行如下代碼: 

           var func=new function(){this.a="func"

          var myfunc=function(x){ 
          var a="myfunc"
          alert(
          this.a); 
          alert(x); 

          myfunc.call(func,
          "var"); 

          可見分別彈出了func和var。到這里就對call的每個參數的意義有所了解了。 


          對于apply和call兩者在作用上是相同的,但兩者在參數上有區別的。 

          對于第一個參數意義都一樣,但對第二個參數: 

          apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。 

          如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3]) 


          同時使用apply的好處是可以直接將當前函數的arguments對象作為apply的第二個參數傳入

          posted on 2010-08-04 17:13 Eric_jiang 閱讀(1755) 評論(0)  編輯  收藏 所屬分類: JavaScript
          主站蜘蛛池模板: 蕉岭县| 天水市| 普定县| 丰县| 贵港市| 岢岚县| 富裕县| 崇州市| 峨边| 海盐县| 孝昌县| 广汉市| 千阳县| 临沧市| 大同市| 游戏| 泽普县| 杭锦后旗| 永和县| 朝阳县| 文水县| 石林| 巫山县| 无棣县| 巧家县| 常熟市| 司法| 南阳市| 阳谷县| 恩施市| 庆阳市| 溆浦县| 宁波市| 张掖市| 孝义市| 湘潭市| 年辖:市辖区| 宜兰市| 萍乡市| 靖远县| 叶城县|