自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

全面理解Javascript的caller與callee概念

開發(fā) 前端
本文將使您全面理解Javascript的caller、callee、call、apply概念。其中caller方法是用來返回一個對函數(shù)的引用,該函數(shù)調(diào)用了當(dāng)前函數(shù)。

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

Arguments

該對象代表正在執(zhí)行的函數(shù)和調(diào)用它的函數(shù)的參數(shù)。

[function.]arguments[n]

參數(shù)function:選項。當(dāng)前正在執(zhí)行的Function對象的名字。n:選項。要傳遞給Function對象的從0開始的參數(shù)值索引。

說明

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

  1. viewplaincopytoclipboardprint?  
  2. //arguments對象的用法。  
  3. functionArgTest(a,b){  
  4. vari,s="TheArgTestfunctionexpected";  
  5. varnumargs=arguments.length;//獲取被傳遞參數(shù)的數(shù)值。  
  6. varexpargs=ArgTest.length;//獲取期望參數(shù)的數(shù)值。  
  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);//返回參數(shù)列表。  

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

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

運行代碼你會發(fā)現(xiàn)第一個alert顯示1,這表示數(shù)組對象擁有selfvalue屬性,值為1,而當(dāng)你調(diào)用函數(shù)testAguments時,你會發(fā)現(xiàn)顯示的是“undefined”,說明了不是arguments的屬性,即arguments并不是一個數(shù)組對象。

caller

返回一個對函數(shù)的引用,該函數(shù)調(diào)用了當(dāng)前函數(shù)。

functionName.caller

functionName對象是所執(zhí)行函數(shù)的名稱。

說明

對于函數(shù)來說,caller屬性只有在函數(shù)執(zhí)行時才有定義。如果函數(shù)是由頂層調(diào)用的,那么caller包含的就是null。如果在字符串上下文中使用caller屬性,那么結(jié)果和functionName.toString一樣,也就是說,顯示的是函數(shù)的反編譯文本。
下面的例子說明了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

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

[function.]arguments.callee

可選項function參數(shù)是當(dāng)前正在執(zhí)行的Function對象的名稱。

說明

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

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

  1. viewplaincopytoclipboardprint?  
  2. //callee可以打印其本身  
  3. functioncalleeDemo(){  
  4. alert(arguments.callee);  
  5. }  
  6. //用于驗證參數(shù)  
  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. //比較一般的遞歸函數(shù):  
  24. varsum=function(n){  
  25. if(1==n)return1;  
  26. elsereturnn+sum(n-1); 

調(diào)用時:alert(sum(100));

其中函數(shù)內(nèi)部包含了對sum自身的引用,函數(shù)名僅僅是一個變量名,在函數(shù)內(nèi)部調(diào)用sum即相當(dāng)于調(diào)用一個全局變量,不能很好的體現(xiàn)出是調(diào)用自身,這時使用callee會是一個比較好的方法。

applyandcall

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

apply(thisArg,argArray);

call(thisArg[,arg1,arg2…]]);

即所有函數(shù)內(nèi)部的this指針都會被賦值為thisArg,這可實現(xiàn)將函數(shù)作為另外一個對象的方法運行的目的

apply的說明

如果argArray不是一個有效的數(shù)組或者不是arguments對象,那么將導(dǎo)致一個TypeError。如果沒有提供argArray和thisArg任何一個參數(shù),那么Global對象將被用作thisArg,并且無法被傳遞任何參數(shù)。

call的說明

call方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛蓆hisArg指定的新對象。如果沒有提供thisArg參數(shù),那么Global對象被用作thisArg

相關(guān)技巧:

應(yīng)用call和apply還有一個技巧在里面,就是用call和apply應(yīng)用另一個函數(shù)(類)以后,當(dāng)前的
函數(shù)(類)就具備了另一個函數(shù)(類)的方法或者是屬性,這也可以稱之為“繼承”??聪旅媸纠?

  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來創(chuàng)建一個定義類的模式,
其實現(xiàn)代碼如下:

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

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

示例:

  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(); 

更詳細(xì)的關(guān)于prototype信息請到其官方網(wǎng)站查看。

【編輯推薦】

  1. JavaScript中關(guān)于Cookie的詳細(xì)介紹
  2. JavaScript中confirm,alert,prompt的用法
  3. 基于JavaScript的REST客戶端框架
  4. 如何優(yōu)化JavaScript腳本的性能
  5. 用Javascript連接Access數(shù)據(jù)庫的方法
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

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架構(gòu)理解

2016-10-09 09:37:49

javascript單例模式

2020-10-12 08:35:22

JavaScript

2024-09-02 14:12:56

2010-05-05 18:18:55

IP負(fù)載均衡

2017-05-23 15:47:04

JavaScriptthis解析

2020-11-06 00:52:33

Flink水印延遲數(shù)據(jù)

2009-08-24 14:26:42

C# 泛型類

2023-11-13 16:33:46

2016-11-22 11:08:34

asyncjavascript

2012-05-09 09:22:33

2009-12-29 15:24:09

VPN網(wǎng)絡(luò)建設(shè)

2010-08-30 17:46:10

DHCP服務(wù)

2009-10-23 18:47:35

GNULinux

2009-01-08 09:26:06

C語言指針類型

2010-07-16 12:59:46

Perl簡單變量

2014-02-26 14:24:40

iOSUIScrollVieUIview
點贊
收藏

51CTO技術(shù)棧公眾號