日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript中的arguments,callee,caller

發(fā)布時間:2023/12/4 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript中的arguments,callee,caller 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

arguments:

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

[function.]arguments[n]參數(shù)

function:選項。當前正在執(zhí)行的 Function 對象的名字。?

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

function?ArgTest(a,?b){var?i,?s?=?"The?ArgTest?function?expected?";var?numargs?=?arguments.length;?????//?獲取被傳遞參數(shù)的數(shù)值。var?expargs?=?ArgTest.length;???????//?獲取期望參數(shù)的數(shù)值。if?(expargs?<?2)s?+=?expargs?+?"?argument.?";elses?+=?expargs?+?"?arguments.?";if?(numargs?<?2)s?+=?numargs?+?"?was?passed.";elses?+=?numargs?+?"?were?passed.";s?+=?"?"for?(i?=0?;?i?<?numargs;?i++){??????//?獲取參數(shù)內(nèi)容。s?+=?"????Arg?"?+?i?+?"?=?"?+?arguments[i]?+?"?";}return(s);??????????????????????????//?返回參數(shù)列表。 }

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

alert(new?Array().selfvalue); function?testAguments(){alert(arguments.selfvalue); }

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

在此附加上大家推薦的一個簡單方法:

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

caller:

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

? ? functionName.caller?

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

說明

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

注意:Function.toString() 可以實現(xiàn) Function 的反編譯功能.如加上遞歸功能則功能更加強大

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

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

callee :

?返回正被執(zhí)行的 Function 對象,也就是所指定的 Function 對象的正文。[function.]arguments.callee可選項 function參數(shù)是當前正在執(zhí)行的 Function對象的名稱。說明callee屬性的初始值就是正被執(zhí)行的 Function 對象。callee屬性是 arguments 對象的一個成員,它表示對函數(shù)對象本身的引用,這有利于匿名

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

僅當相關(guān)函數(shù)正在執(zhí)行時才可用。還有需要注意的是callee擁有l(wèi)ength屬性,這個屬性有時候

用于驗證還是比較好的。arguments.length是實參長度,arguments.callee.length是

形參長度,由此可以判斷調(diào)用時形參長度是否和實參長度一致。示例//callee可以打印其本身

function?calleeDemo()?{alert(arguments.callee); }//用于驗證參數(shù) 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;elsereturn?n?+?arguments.callee(n?-?1) } //比較一般的遞歸函數(shù): var?sum?=?function(n){if?(1==n)?return?1;else?return?n?+?sum?(n-1); }

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

其中函數(shù)內(nèi)部包含了對sum自身的引用,函數(shù)名僅僅是一個變量名,在函數(shù)內(nèi)部調(diào)用sum即相當于調(diào)用

一個全局變量,不能很好的體現(xiàn)出是調(diào)用自身,這時使用callee會是一個比較好的方法。

apply and call :

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

apply(thisArg,argArray); ? ??

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

即所有函數(shù)內(nèi)部的this指針都會被賦值為thisArg,這可實現(xiàn)將函數(shù)作為另外一個對象的方法運行的目的apply的說明如果 argArray不是一個有效的數(shù)組或者不是 arguments對象,那么將導致一個 TypeError。

如果沒有提供 argArray和 thisArg任何一個參數(shù),那么 Global 對象將被用作 thisArg,?

并且無法被傳遞任何參數(shù)。call的說明call方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisArg指定的新對象。

如果沒有提供 thisArg參數(shù),那么 Global 對象被用作 thisArg相關(guān)技巧:應用call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(shù)(類)以后,當前的

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

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

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

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

構(gòu)造函數(shù),其中調(diào)用initialize,而這個方法是在類創(chuàng)建時定義的初始化函數(shù)。通過如此途徑,

就可以實現(xiàn)prototype中的類創(chuàng)建模式示例:

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

?


轉(zhuǎn)載于:https://my.oschina.net/mayflygeekCarry/blog/364946

總結(jié)

以上是生活随笔為你收集整理的JavaScript中的arguments,callee,caller的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。