在提到上述的概念之前,首先想說說 javascript 中函數的隱含參數: arguments
Arguments
該對象代表正在執行的函數和調用它的函數的參數。
[ function . ] arguments[ n ]
?
?
?
參數 function :選項。當前正在執行的 Function 對象的名字。 n :選項。要傳遞給 Function 對象的從 0 開始的參數值索引。
?
?
?
說明
Arguments
是進行函數調用時,除了指定的參數外,還另外創建的一個隱藏對象。
Arguments
是一個類似數組但不是數組的對象,說它類似數組是因為其具有數組一樣的訪問性質及方式,可以由
arguments[
n
]
來訪問對應的單個參數的值,并擁有數組長度屬性
length
。還有就是
arguments
對象存儲的是實際傳遞給函數的參數,而不局限于函數聲明所定義的參數列表,而且
不能顯式創建
arguments
對象。
arguments
對象只有函數開始時才可用。下邊例子詳細說明了這些性質
:
callee
function ?ArgTest(a,?b){
??? var ?i,?s? = ? " The?ArgTest?function?expected? " ;
??? var ?numargs? = ?arguments.length;????? // ?獲取被傳遞參數的數值。
??? var ?expargs? = ?ArgTest.length;??????? // ?獲取期望參數的數值。
??? 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 ++ ){?????? // ?獲取參數內容。
???s? += ? " ??Arg? " ? + ?i? + ? " ?=? " ? + ?arguments[i]? + ? " \n " ;
???}
??? return (s);?????????????????????????? // ?返回參數列表。
}
?
在此添加了一個說明arguments不是數組(Array類)的代碼:
alert( new ?Array().selfvalue);
function ?testAguments(){
????alert(arguments.selfvalue);
}
?
運行代碼你會發現第一個alert顯示1,這表示數組對象擁有selfvalue屬性,值為1,而當你調用函數testAguments時,你會發現顯示的是“undefined”,說明了不是arguments的屬性,即arguments并不是一個數組對象。
在此附加上大家推薦的一個簡單方法
:
?


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

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