在提到上述的概念之前,首先想說(shuō)說(shuō) javascript 中函數(shù)的隱含參數(shù): arguments
Arguments
該對(duì)象代表正在執(zhí)行的函數(shù)和調(diào)用它的函數(shù)的參數(shù)。
[ function . ] arguments[ n ]
?
?
?
參數(shù) function :選項(xiàng)。當(dāng)前正在執(zhí)行的 Function 對(duì)象的名字。 n :選項(xiàng)。要傳遞給 Function 對(duì)象的從 0 開(kāi)始的參數(shù)值索引。
?
?
?
說(shuō)明
Arguments
是進(jìn)行函數(shù)調(diào)用時(shí),除了指定的參數(shù)外,還另外創(chuàng)建的一個(gè)隱藏對(duì)象。
Arguments
是一個(gè)類(lèi)似數(shù)組但不是數(shù)組的對(duì)象,說(shuō)它類(lèi)似數(shù)組是因?yàn)槠渚哂袛?shù)組一樣的訪(fǎng)問(wèn)性質(zhì)及方式,可以由
arguments[
n
]
來(lái)訪(fǎng)問(wèn)對(duì)應(yīng)的單個(gè)參數(shù)的值,并擁有數(shù)組長(zhǎng)度屬性
length
。還有就是
arguments
對(duì)象存儲(chǔ)的是實(shí)際傳遞給函數(shù)的參數(shù),而不局限于函數(shù)聲明所定義的參數(shù)列表,而且
不能顯式創(chuàng)建
arguments
對(duì)象。
arguments
對(duì)象只有函數(shù)開(kāi)始時(shí)才可用。下邊例子詳細(xì)說(shuō)明了這些性質(zhì)
:
callee
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.? " ;
??? 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 ++ ){?????? // ?獲取參數(shù)內(nèi)容。
???s? += ? " ??Arg? " ? + ?i? + ? " ?=? " ? + ?arguments[i]? + ? " \n " ;
???}
??? return (s);?????????????????????????? // ?返回參數(shù)列表。
}
?
在此添加了一個(gè)說(shuō)明arguments不是數(shù)組(Array類(lèi))的代碼:
alert( new ?Array().selfvalue);
function ?testAguments(){
????alert(arguments.selfvalue);
}
?
運(yùn)行代碼你會(huì)發(fā)現(xiàn)第一個(gè)alert顯示1,這表示數(shù)組對(duì)象擁有selfvalue屬性,值為1,而當(dāng)你調(diào)用函數(shù)testAguments時(shí),你會(huì)發(fā)現(xiàn)顯示的是“undefined”,說(shuō)明了不是arguments的屬性,即arguments并不是一個(gè)數(shù)組對(duì)象。
在此附加上大家推薦的一個(gè)簡(jiǎn)單方法
:
?


?caller
? 返回一個(gè)對(duì)函數(shù)的引用,該函數(shù)調(diào)用了當(dāng)前函數(shù)。
? functionName.caller
? functionName
對(duì)象是所執(zhí)行函數(shù)的名稱(chēng)。
說(shuō)明
對(duì)于函數(shù)來(lái)說(shuō),
caller
屬性只有在函數(shù)執(zhí)行時(shí)才有定義。如果函數(shù)是由頂層調(diào)用的,那么
caller
包含的就是
null
。如果在字符串上下文中使用
caller
屬性,那么結(jié)果和
functionName.toString
一樣,也就是說(shuō),顯示的是函數(shù)的反編譯文本。
下面的例子說(shuō)明了
caller
屬性的用法:
?
function ?callerDemo()?{
???? if ?(callerDemo.caller)?{
???????? var ?a = ?callerDemo.caller.toString();
????????alert(a);
????}? else ?{
????????alert( " this?is?a?top?function " );
????}
}
function ?handleCaller()?{
????callerDemo();
}
?
?
?
??? 返回正被執(zhí)行的 Function 對(duì)象,也就是所指定的 Function 對(duì)象的正文。
?
[ function . ] arguments. callee
?
?
?
可選項(xiàng) function 參數(shù)是當(dāng)前正在執(zhí)行的 Function 對(duì)象的名稱(chēng)。
說(shuō)明
callee 屬性的初始值就是正被執(zhí)行的 Function 對(duì)象。
callee
屬性是
arguments
對(duì)象的一個(gè)成員,
它表示對(duì)函數(shù)對(duì)象本身的引用,這有利于匿名
函數(shù)的遞歸或者保證函數(shù)的封裝性
,例如下邊示例的遞歸計(jì)算
1
到
n
的自然數(shù)之和。而該屬性
僅當(dāng)相關(guān)函數(shù)正在執(zhí)行時(shí)才可用。還有需要注意的是
callee
擁有
length
屬性,這個(gè)屬性有時(shí)候
用于驗(yàn)證還是比較好的。
arguments.length
是實(shí)參長(zhǎng)度,
arguments.callee.length
是
形參長(zhǎng)度,由此可以判斷調(diào)用時(shí)形參長(zhǎng)度是否和實(shí)參長(zhǎng)度一致。
示例
?
?
比較一般的遞歸函數(shù):
?
?
?
function ?calleeDemo()?{
????alert(arguments.callee);
}
// 用于驗(yàn)證參數(shù)
function ?calleeLengthDemo(arg1,?arg2)?{
???? if ?(arguments.length == arguments.callee.length)?{
????????window.alert( " 驗(yàn)證形參和實(shí)參長(zhǎng)度正確! " );
???????? return ;
????}? else ?{
????????alert( " 實(shí)參長(zhǎng)度: " ? + arguments.length);
????????alert( " 形參長(zhǎng)度:? " ? + arguments.callee.length);
????}
}
// 遞歸計(jì)算
var ?sum? = ? function (n){
?? if ?(n? <= ? 0 )????????????????????????
?? return ? 1 ;
?? else
???? return ?n?+arguments.callee(n? - ? 1 )
}
?
?
調(diào)用時(shí):
alert(sum(100));
其中函數(shù)內(nèi)部包含了對(duì)
sum
自身的引用,函數(shù)名僅僅是一個(gè)變量名,在函數(shù)內(nèi)部調(diào)用
sum
即相當(dāng)于調(diào)用
一個(gè)全局變量,不能很好的體現(xiàn)出是調(diào)用自身,這時(shí)使用
callee
會(huì)是一個(gè)比較好的方法。
apply and call
?? 它們的作用都是將函數(shù)綁定到另外一個(gè)對(duì)象上去運(yùn)行,兩者僅在定義參數(shù)方式有所區(qū)別:
??? apply (thisArg,argArray);
??? call (thisArg[,arg1,arg2…] ]);
即所有函數(shù)內(nèi)部的 this 指針都會(huì)被賦值為 thisArg ,這可實(shí)現(xiàn)將函數(shù)作為另外一個(gè)對(duì)象的方法運(yùn)行的目的
apply 的說(shuō)明
如果
argArray
不是一個(gè)有效的數(shù)組或者不是
arguments
對(duì)象,那么將導(dǎo)致一個(gè)
TypeError
。
如果沒(méi)有提供
argArray
和
thisArg
任何一個(gè)參數(shù),那么
Global
對(duì)象將被用作
thisArg
,
并且無(wú)法被傳遞任何參數(shù)。
call 的說(shuō)明
call
方法可將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛?
thisArg
指定的新對(duì)象。
如果沒(méi)有提供
thisArg
參數(shù),那么
Global
對(duì)象被用作
thisArg
相關(guān)技巧 :
應(yīng)用
call
和
apply
還有一個(gè)技巧在里面,就是用
call
和
apply
應(yīng)用另一個(gè)函數(shù)(類(lèi))以后,當(dāng)前的
函數(shù)(類(lèi))就具備了另一個(gè)函數(shù)(類(lèi))的方法或者是屬性,這也可以稱(chēng)之為“繼承”。看下面示例:
call
之后,
extend
可以繼承到
base
的方法和屬性。
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);
}
上面的例子可以看出,通過(guò)
?
順便提一下,在 javascript 框架 prototype 里就使用 apply 來(lái)創(chuàng)建一
個(gè)定義類(lèi)的模式,
其實(shí)現(xiàn)代碼如下:
??create:? function ()?{
???? return ? function ()?{
?????? this .initialize.apply( this ,?arguments);
????}
??}
}
?
解析:從代碼看
,
該對(duì)象僅包含一個(gè)方法:
Create
,其返回一個(gè)函數(shù),即類(lèi)。但這也同時(shí)是類(lèi)的構(gòu)造函數(shù),其中調(diào)用
initialize
,而這個(gè)方法是在類(lèi)創(chuàng)建時(shí)定義的初始化函數(shù)。通過(guò)如此途徑,就可以實(shí)現(xiàn)
prototype
中的類(lèi)創(chuàng)建模式
?
示例
:
prototype
信息請(qǐng)到其官方網(wǎng)站查看。
vehicle.prototype = {
????initialize: function (type){
???????? this .type = type;
????}
????showSelf: function (){
????????alert( " this?vehicle?is? " + ? this .type);
????}
}
var ?moto = new ?vehicle( " Moto " );
moto.showSelf();
更詳細(xì)的關(guān)于
評(píng)論還有更精彩對(duì)此的理解,在這我就不再添加了,大家可以看看加深理解。?
?
轉(zhuǎn)自:
http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
