成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

全面理解Javascript的caller與callee概念

開發 前端
本文將使您全面理解Javascript的caller、callee、call、apply概念。其中caller方法是用來返回一個對函數的引用,該函數調用了當前函數。

在提到上述的概念之前,首先想說說Javascript中函數的隱含參數:arguments

Arguments

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

[function.]arguments[n]

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

說明

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

  1. viewplaincopytoclipboardprint?  
  2. //arguments對象的用法。  
  3. functionArgTest(a,b){  
  4. vari,s="TheArgTestfunctionexpected";  
  5. varnumargs=arguments.length;//獲取被傳遞參數的數值。  
  6. varexpargs=ArgTest.length;//獲取期望參數的數值。  
  7. if(expargs<2)  
  8. s+=expargs+"argument.";  
  9. else  
  10. s+=expargs+"arguments.";  
  11. if(numargs<2)  
  12. s+=numargs+"waspassed.";  
  13. else  
  14. s+=numargs+"werepassed.";  
  15. s+="\n\n"  
  16. for(i=0;is+="Arg"+i+"="+arguments[i]+"\n";  
  17. }  
  18. return(s);//返回參數列表。  

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

  1. viewplaincopytoclipboardprint?  
  2. Array.prototype.selfvalue=1;  
  3. alert(newArray().selfvalue);  
  4. functiontestAguments(){  
  5. alert(arguments.selfvalue);  

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

caller

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

functionName.caller

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

說明

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

  1. viewplaincopytoclipboardprint?  
  2. //callerdemo{  
  3. functioncallerDemo(){  
  4. if(callerDemo.caller){  
  5. vara=callerDemo.caller.toString();  
  6. alert(a);  
  7. }else{  
  8. alert("thisisatopfunction");  
  9. }  
  10. }  
  11. functionhandleCaller(){  
  12. callerDemo();  

callee

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

[function.]arguments.callee

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

說明

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

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

  1. viewplaincopytoclipboardprint?  
  2. //callee可以打印其本身  
  3. functioncalleeDemo(){  
  4. alert(arguments.callee);  
  5. }  
  6. //用于驗證參數  
  7. functioncalleeLengthDemo(arg1,arg2){  
  8. if(arguments.length==arguments.callee.length){  
  9. window.alert("驗證形參和實參長度正確!");  
  10. return;  
  11. }else{  
  12. alert("實參長度:"+arguments.length);  
  13. alert("形參長度:"+arguments.callee.length);  
  14. }  
  15. }  
  16. //遞歸計算  
  17. varsum=function(n){  
  18. if(n<=0)  
  19. return1;  
  20. else  
  21. returnn+arguments.callee(n-1)  
  22. }  
  23. //比較一般的遞歸函數:  
  24. varsum=function(n){  
  25. if(1==n)return1;  
  26. elsereturnn+sum(n-1); 

調用時:alert(sum(100));

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

applyandcall

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

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應用另一個函數(類)以后,當前的
函數(類)就具備了另一個函數(類)的方法或者是屬性,這也可以稱之為“繼承”。看下面示例:

  1. viewplaincopytoclipboardprint?  
  2. //繼承的演示  
  3. functionbase(){  
  4. this.member="dnnsun_Member";  
  5. this.method=function(){  
  6. window.alert(this.member);  
  7. }  
  8. }  
  9. functionextend(){  
  10. base.call(this);  
  11. window.alert(member);  
  12. window.alert(this.method);  

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

順便提一下,在javascript框架prototype里就使用apply來創建一個定義類的模式,
其實現代碼如下:

  1. viewplaincopytoclipboardprint?  
  2. varClass={  
  3. create:function(){  
  4. returnfunction(){  
  5. this.initialize.apply(this,arguments);  
  6. }  
  7. }  

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

示例:

  1. viewplaincopytoclipboardprint?  
  2. varvehicle=Class.create();  
  3. vehicle.prototype={  
  4. initialize:function(type){  
  5. this.type=type;  
  6. }  
  7. showSelf:function(){  
  8. alert("thisvehicleis"+this.type);  
  9. }  
  10. }  
  11. varmoto=newvehicle("Moto");  
  12. moto.showSelf(); 

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

【編輯推薦】

  1. JavaScript中關于Cookie的詳細介紹
  2. JavaScript中confirm,alert,prompt的用法
  3. 基于JavaScript的REST客戶端框架
  4. 如何優化JavaScript腳本的性能
  5. 用Javascript連接Access數據庫的方法
責任編輯:彭凡 來源: cnblogs
相關推薦

2015-11-04 09:57:18

JavaScript原型

2009-07-15 17:11:31

JDBC的概念

2020-05-06 09:11:50

DevOps

2015-12-10 09:24:54

Linux架構理解

2016-10-09 09:37:49

javascript單例模式

2017-05-23 15:47:04

JavaScriptthis解析

2010-05-05 18:18:55

IP負載均衡

2020-10-12 08:35:22

JavaScript

2024-09-02 14:12:56

2009-12-29 15:24:09

VPN網絡建設

2010-08-30 17:46:10

DHCP服務

2012-05-09 09:22:33

2009-08-24 14:26:42

C# 泛型類

2010-07-16 12:59:46

Perl簡單變量

2009-10-23 18:47:35

GNULinux

2009-01-08 09:26:06

C語言指針類型

2020-11-06 00:52:33

Flink水印延遲數據

2016-11-22 11:08:34

asyncjavascript

2023-11-13 16:33:46

2014-02-26 14:24:40

iOSUIScrollVieUIview
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品久久一区二区三区 | 一区二区三区国产 | 亚洲啪啪一区 | 日韩欧美国产一区二区三区 | www4虎| 国产午夜精品久久久 | 午夜免费网站 | avmans最新导航地址 | 欧洲成人午夜免费大片 | 国精日本亚洲欧州国产中文久久 | 亚洲成人动漫在线观看 | 亚洲精品一二三区 | 亚洲三区视频 | 国产精品国产自产拍高清 | 九九九久久国产免费 | 日韩中文在线 | 中文字幕日韩欧美一区二区三区 | 激情的网站 | 国产一区二区精品自拍 | 天天操天天舔 | 亚洲国产中文字幕 | 蜜臀久久| 一区二区三区四区在线视频 | 九九热国产视频 | 国产小网站 | 国产成人精品一区二 | 亚洲精品久久久久久国产精华液 | 青青草网 | 国产一区二区精品自拍 | 日中文字幕在线 | 色婷婷一区二区三区四区 | 日韩一区二区三区在线看 | 中文字幕 视频一区 | 综合网伊人 | 免费一级片 | 欧美成人激情视频 | 久久a久久| 亚洲成人精品 | 人人做人人澡人人爽欧美 | 91丨九色丨国产在线 | 国产福利小视频 |