The NoteBook of EricKong

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

          常用鏈接

          留言簿(11)

          我參與的團隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          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 閱讀(1754) 評論(0)  編輯  收藏 所屬分類: JavaScript
          主站蜘蛛池模板: 石家庄市| 南昌市| 利辛县| 苏尼特右旗| 泽州县| 三穗县| 鹿邑县| 双鸭山市| 建宁县| 遵义市| 洪江市| 错那县| 黎城县| 漾濞| 萝北县| 东兰县| 宽甸| 光泽县| 孟津县| 揭东县| 满洲里市| 奉新县| 新竹市| 广东省| 密云县| 咸阳市| 长汀县| 观塘区| 大足县| 瓦房店市| 桑日县| 屯留县| 平邑县| 阿合奇县| 南岸区| 墨脱县| 晋中市| 甘南县| 阿城市| 化州市| 盈江县|