熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JavaScript中的caller,callee,call,apply詳細介紹

2013-11-15 12:11:31  來源: JSP教程 

  首先想說說javascript中函數的隱含參數arguments

  Arguments

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

  [function]arguments[n]

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

  說明

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

  //arguments 對象的用法

  function ArgTest(a b){

  var i s = "The ArgTest function expected ";

  var numargs = argumentslength; // 獲取被傳遞參數的數值

  var expargs = ArgTestlength; // 獲取期望參數的數值

  if (expargs < )

  s += expargs + " argument ";

  else

  s += expargs + " arguments ";

  if (numargs < )

  s += numargs + " was passed";

  else

  s += numargs + " were passed";

  s += "\n\n"

  for (i = ; i < numargs; i++){ // 獲取參數內容

  s += " Arg " + i + " = " + arguments[i] + "\n";

  }

  return(s); // 返回參數列表

  }

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

  Arrayprototypeselfvalue = ;

  alert(new Array()selfvalue);

  function testAguments(){

  alert(argumentsselfvalue);

  }

  運行代碼你會發現第一個alert顯示這表示數組對象擁有selfvalue屬性值為而當你調用函數testAguments時你會發現顯示的是“undefined”說明了不是arguments的屬性即arguments並不是一個數組對象

  caller

  返回一個對函數的引用該函數調用了當前函數

  functionNamecaller

  functionName 對象是所執行函數的名稱

  說明

  對於函數來說caller 屬性只有在函數執行時才有定義如果函數是由頂層調用的那麼 caller 包含的就是 null 如果在字符串上下文中使用 caller 屬性那麼結果和 functionNametoString 一樣也就是說顯示的是函數的反編譯文本

  下面的例子說明了 caller 屬性的用法

  // caller demo {

  function callerDemo() {

  if (callerDemocaller) {

  var a= callerDemocallertoString();

  alert(a);

  } else {

  alert("this is a top function");

  }

  }

  function handleCaller() {

  callerDemo();

  }

  callee

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

  [function]argumentscallee

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

  說明

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

  callee 屬性是 arguments 對象的一個成員它表示對函數對象本身的引用這有利於匿名

  函數的遞歸或者保證函數的封裝性例如下邊示例的遞歸計算到n的自然數之和而該屬性

  僅當相關函數正在執行時才可用還有需要注意的是callee擁有length屬性這個屬性有時候

  用於驗證還是比較好的argumentslength是實參長度argumentscalleelength是

  形參長度由此可以判斷調用時形參長度是否和實參長度一致

  示例

  //callee可以打印其本身

  function calleeDemo() {

  alert(argumentscallee);

  }

  //用於驗證參數

  function calleeLengthDemo(arg arg) {

  if (argumentslength==argumentscalleelength) {

  windowalert("驗證形參和實參長度正確!");

  return;

  } else {

  alert("實參長度" +argumentslength);

  alert("形參長度 " +argumentscalleelength);

  }

  }

  //遞歸計算

  var sum = function(n){

  if (n <= )

  return ;

  else

  return n +argumentscallee(n )

  }

  比較一般的遞歸函數

  var sum = function(n){

  if (==n) return ;

  else return n + sum (n);

  調用時alert(sum());

  其中函數內部包含了對sum自身的引用函數名僅僅是一個變量名在函數內部調用sum即相當於調用

  一個全局變量不能很好的體現出是調用自身這時使用callee會是一個比較好的方法

  apply and call

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

  apply(thisArgargArray);

  call(thisArg[argarg…] ]);

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

  apply的說明

  如果 argArray 不是一個有效的數組或者不是 arguments 對象那麼將導致一個 TypeError

  如果沒有提供 argArray 和 thisArg任何一個參數那麼 Global 對象將被用作 thisArg

  並且無法被傳遞任何參數

  call的說明

  call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisArg指定的新對象

  如果沒有提供 thisArg參數那麼 Global 對象被用作 thisArg

  相關技巧

  應用call和apply還有一個技巧在裡面就是用call和apply應用另一個函數(類)以後當前的

  函數(類)就具備了另一個函數(類)的方法或者是屬性這也可以稱之為“繼承”看下面示例:

  // 繼承的演示

  function base() {

  thismember = " dnnsun_Member";

  thismethod = function() {

  windowalert(thismember);

  }

  }

  function extend() {

  basecall(this);

  windowalert(member);

  windowalert(thismethod);

  }

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

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

  其實現代碼如下

  var Class = {

  create: function() {

  return function() {

  thisinitializeapply(this arguments);

  }

  }

  }

  解析從代碼看該對象僅包含一個方法Create其返回一個函數即類但這也同時是類的

  構造函數其中調用initialize而這個方法是在類創建時定義的初始化函數通過如此途徑

  就可以實現prototype中的類創建模式

  示例

  var vehicle=Classcreate();

  vehicleprototype={

  initialize:function(type){

  thistype=type;

  }

  showSelf:function(){

  alert("this vehicle is "+ thistype);

  }

  }

  var moto=new vehicle("Moto");

  motoshowSelf();


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20467.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.