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

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

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

    憨厚生

    ----Java's Slave----
    ***Java's Host***

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      165 隨筆 :: 17 文章 :: 90 評論 :: 0 Trackbacks
    轉 http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html

    (在看到大家如此關注JS里頭的這幾個對象,我試著把原文再修改一下,力求能再詳細的闡明個中意義  2007-05-21
    在提到上述的概念之前,首先想說說javascript中函數的隱含參數:arguments

    Arguments

    該對象代表正在執行的函數和調用它的函數的參數。

    [function.]arguments[n]
    參數
    function :選項。當前正在執行的 Function 對象的名字。
    n :選項。要傳遞給 Function 對象的從0開始的參數值索引。

    說明

    Arguments是進行函數調用時,除了指定的參數外,還另外創建的一個隱藏對象。Arguments是一個類似數組但不是數組的對象,說它類似數組是因為其具有數組一樣的訪問性質及方式,可以由arguments[n]來訪問對應的單個參數的值,并擁有數組長度屬性length。還有就是arguments對象存儲的是實際傳遞給函數的參數,而不局限于函數聲明所定義的參數列表,而且不能顯式創建 arguments 對象。arguments 對象只有函數開始時才可用。下邊例子詳細說明了這些性質:

    //arguments 對象的用法。
    function ArgTest(a, b){
       
    var i, s = "The ArgTest function expected "
    ;
       
    var numargs = arguments.length;     // 獲取被傳遞參數的數值。

       var expargs = ArgTest.length;       // 獲取期望參數的數值。
       if (expargs < 2)
          s 
    += expargs + " argument. "
    ;
       
    else

          s 
    += expargs + " arguments. ";
       
    if (numargs < 2
    )
          s 
    += numargs + " was passed."
    ;
       
    else

          s 
    += numargs + " were passed.";
       s 
    += "\n\n"

       
    for (i =0 ; i < numargs; i++){      // 獲取參數內容。
       s += "  Arg " + i + " = " + arguments[i] + "\n";
       }
       
    return(s);                          // 返回參數列表。

    }


    在此添加了一個說明arguments不是數組(Array類)的代碼:

    Array.prototype.selfvalue = 1;
    alert(
    new
     Array().selfvalue);
    function
     testAguments(){
        alert(arguments.selfvalue);
    }


    運行代碼你會發現第一個alert顯示1,這表示數組對象擁有selfvalue屬性,值為1,而當你調用函數testAguments時,你會發現顯示的是“undefined”,說明了不是arguments的屬性,即arguments并不是一個數組對象。
    在此附加上大家推薦的一個簡單方法

    alert(arguments instanceof Array);
    alert(arguments 
    instanceof Object);



     caller
      返回一個對函數的引用,該函數調用了當前函數。
      functionName.caller
      functionName 對象是所執行函數的名稱。
    說明
    對于函數來說,caller 屬性只有在函數執行時才有定義。如果函數是由頂層調用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 屬性,那么結果和 functionName.toString 一樣,也就是說,顯示的是函數的反編譯文本。
    下面的例子說明了 caller 屬性的用法:

    // caller demo {
    function callerDemo() {
        
    if (callerDemo.caller) {
            
    var a= callerDemo.caller.toString();
            alert(a);
        } 
    else {
            alert(
    "this is a top function");
        }
    }
    function handleCaller() {
        callerDemo();
    }


    callee

        返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文。

    [function.]arguments.callee

    可選項 function 參數是當前正在執行的 Function 對象的名稱。

    說明

    callee 屬性的初始值就是正被執行的 Function 對象。

    callee 屬性是 arguments 對象的一個成員,它表示對函數對象本身的引用,這有利于匿名
    函數的遞歸或者保證函數的封裝性
    ,例如下邊示例的遞歸計算1n的自然數之和。而該屬性
    僅當相關函數正在執行時才可用。還有需要注意的是callee擁有length屬性,這個屬性有時候
    用于驗證還是比較好的。arguments.length是實參長度,arguments.callee.length
    形參長度,由此可以判斷調用時形參長度是否和實參長度一致。

    示例

    //callee可以打印其本身
    function calleeDemo() {
        alert(arguments.callee);
    }
    //用于驗證參數
    function calleeLengthDemo(arg1, arg2) {
        
    if (arguments.length==arguments.callee.length) {
            window.alert(
    "驗證形參和實參長度正確!");
            
    return;
        } 
    else {
            alert(
    "實參長度:" +arguments.length);
            alert(
    "形參長度: " +arguments.callee.length);
        }
    }
    //遞歸計算
    var sum = function(n){
      
    if (n <= 0)                        
      
    return 1;
      
    else
        
    return n +arguments.callee(n - 1)
    }

    比較一般的遞歸函數:

    var sum = function(n){
        
    if (1==n) return 1;
    else return n + sum (n-1);

    調用時:alert(sum(100));
    其中函數內部包含了對sum自身的引用,函數名僅僅是一個變量名,在函數內部調用sum即相當于調用
    一個全局變量,不能很好的體現出是調用自身,這時使用callee會是一個比較好的方法。

    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

    相關技巧

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

    // 繼承的演示
    function base() {
        
    this.member = " dnnsun_Member";
        
    this.method = function() {
            window.alert(
    this.member);
        }
    }
    function extend() {
        base.call(
    this);
        window.alert(member);
        window.alert(
    this.method);
    }


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

     

    順便提一下,在javascript框架prototype里就使用apply來創建一個定義類的模式,

    其實現代碼如下:

    var Class = {
      create: 
    function() {
        
    return function() {
          
    this.initialize.apply(this, arguments);
        }
      }
    }

    解析:從代碼看,該對象僅包含一個方法:Create,其返回一個函數,即類。但這也同時是類的
    構造函數,其中調用initialize,而這個方法是在類創建時定義的初始化函數。通過如此途徑,
    就可以實現prototype中的類創建模式

    示例

    var vehicle=Class.create();
    vehicle.prototype
    ={
        initialize:
    function(type){
            
    this.type=type;
        }
        showSelf:
    function(){
            alert(
    "this vehicle is "+ this.type);
        }
    }

    var moto=new vehicle("Moto");
    moto.showSelf();


    更詳細的關于prototype信息請到其官方網站查看。

    評論還有更精彩對此的理解,在這我就不再添加了,大家可以看看加深理解。



    posted on 2009-04-10 12:41 二胡 閱讀(188) 評論(0)  編輯  收藏 所屬分類: JS
    主站蜘蛛池模板: 免费大香伊蕉在人线国产| 1000部拍拍拍18勿入免费视频软件 | 免费可以在线看A∨网站| 亚洲三级电影网站| 久久久精品2019免费观看| 久久久久亚洲精品美女| 一级毛片免费视频| 亚洲资源在线视频| 精品久久久久久久久免费影院| 亚洲免费观看网站| 久久精品a一国产成人免费网站| 亚洲国产精品一区二区三区在线观看| 成人激情免费视频| 另类图片亚洲校园小说区| 亚洲精品综合久久| 精品亚洲永久免费精品| 亚洲沟沟美女亚洲沟沟| 好先生在线观看免费播放| 麻豆亚洲AV成人无码久久精品| 亚洲欧洲精品成人久久曰影片 | 在线观看人成网站深夜免费| 相泽南亚洲一区二区在线播放| 日韩亚洲精品福利| 99精品全国免费观看视频..| 久久亚洲精品中文字幕| 91在线视频免费91| 丰满亚洲大尺度无码无码专线| 爱情岛论坛网亚洲品质自拍| 久久免费观看国产99精品| 亚洲a级在线观看| 亚洲av高清在线观看一区二区 | 美女巨胸喷奶水视频www免费| 亚洲综合一区二区国产精品| 成年女人色毛片免费看| 特级做a爰片毛片免费看| 久久亚洲精品国产精品黑人| 最好免费观看韩国+日本| 国产无遮挡无码视频免费软件| 亚洲中文无码永久免费| 亚洲精品你懂的在线观看| 国产a视频精品免费观看|