<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1750) 評論(0)  編輯  收藏 所屬分類: JavaScript
    主站蜘蛛池模板: 亚洲精品成人片在线观看| 亚洲视频无码高清在线| 爱爱帝国亚洲一区二区三区| 成人免费激情视频| 亚洲一区无码中文字幕| 色欲aⅴ亚洲情无码AV| 免费日韩在线视频| 色偷偷亚洲男人天堂| 日韩在线看片免费人成视频播放| 精品亚洲国产成人| 在线a级毛片免费视频| 亚洲人成激情在线播放| 2021免费日韩视频网| 亚洲白嫩在线观看| 日本在线高清免费爱做网站| 亚洲Av无码一区二区二三区| 野花高清在线观看免费3中文| 久久久久se色偷偷亚洲精品av| 在线看片免费不卡人成视频| 亚洲码和欧洲码一码二码三码| 最新69国产成人精品免费视频动漫| 亚洲女女女同性video| 亚洲精品一级无码中文字幕| a级男女仿爱免费视频| 亚洲精品电影天堂网| 国产精品久免费的黄网站| eeuss影院www天堂免费| 亚洲av无码一区二区三区网站 | 免费人成视频在线观看视频| a级大片免费观看| 国产成人精品日本亚洲11| 亚洲AⅤ无码一区二区三区在线 | 色噜噜狠狠色综合免费视频| 亚洲情综合五月天| 日韩一级免费视频| 131美女爱做免费毛片| 黄色网址免费在线| 亚洲最大中文字幕无码网站| 亚洲综合区小说区激情区| 成年男女免费视频网站| 野花香在线视频免费观看大全|