arguments的callee屬性

caller
返回一個對函數的引用,該函數調用了當前函數。
functionName.caller 
functionName 對象是所執行函數的名稱。


說明
對於函數來說,caller屬性只有在函數執行時纔有定義。如果函數是由頂層調用的,那麼 caller包含的就是 null 。如果在字符串上下文中使用 caller屬性,那麼結果和 functionName.toString 一樣,也就是說,顯示的是函數的反編譯文本,
注意:Function.toString() 可以實現 Function 的反編譯功能.如加上遞歸功能則功能更加強大

例子一

<span style="font-size:18px;"><span style="font-size:18px;"><script type="text/javascript">
	 function callerdemo() {
		if (callerdemo.caller) {
			var a= callerdemo.caller.toString();
			alert(a);
		} else {
			alert('this is a top function');
		}
	};
	callerdemo();
</script>
</span></span>


例子一中由於callerdemo是由頂層調用,所以callerdemo.caller 包含的就是null,故而輸出值是 “this is a top function”


例子二

<span style="font-size:18px;"><script type="text/javascript">
window.οnlοad=function(){ 
	 function callerdemo() {
		if (callerdemo.caller) {
			var a= callerdemo.caller.toString();
			alert(a);
		} else {
			alert('this is a top function');
		}
	};
	callerdemo();
}
</script></span>


例子二中返回的是一個對函數的引用,該函數調用了當前函數。

function(){ 
function callerdemo() {
if (callerdemo.caller) {
var a= callerdemo.caller.toString();
alert(a);
} else {
alert('this is a top function');
}
};
callerdemo();
}


例子三

<span style="font-size:18px;"> function callerdemo() {
		if (callerdemo.caller) {
			var a= callerdemo.caller.toString();
			alert(a);
		} else {
			alert('this is a top function');
		}
	};
	function handlecaller() {
		callerdemo();
	};
	handlecaller();</span>

例子三和例子二一樣,都是一個對調用函數的應用,返回值是:

function handlecaller() {
callerdemo();
};


callee
返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文。[function.]arguments.callee可選項 function參數是當前正在執行的 Function對象的名稱。說明callee屬性的初始值就是正被執行的 Function 對象。callee屬性是 arguments 對象的一個成員,它表示對函數對象本身的引用,這有利於匿名函數的遞歸或者保證函數的封裝性,例如下邊示例的遞歸計算1到n的自然數之和。而該屬性僅當相關函數正在執行時纔可用。還有需要注意的是callee擁有length屬性,這個屬性有時候用於驗證還是比較好的。arguments.length是實參長度,arguments.callee.length是形參長度,由此可以判斷調用時形參長度是否和實參長度一致。

<span style="font-size:18px;"><script type="text/javascript">
	 function callerdemo() {
		alert(arguments.callee);
	};

	callerdemo();
</script></span>
返回的即是callerdemo 函數本身。


<span style="font-size:18px;"> function callerdemo() {
		alert(arguments.callee.length+","+arguments.length);
	};

	callerdemo(5);</span>
輸出調用時形參長度和實參長度


<span style="font-size:18px;">function callerdemo(n) {
		if(n==0) return false;
		console.log(n);
		callerdemo(n-1);
	};

	callerdemo(5);</span>

輸出 5,4,3,2,1;
<span style="font-size:18px;"> function callerdemo(n) {
		if(n==1) return 1;
		return n*callerdemo(n-1);
	};
console.log(callerdemo(5));</span>
輸出120;

<span style="font-size:18px;"> function callerdemo(n) {
		if(n==1) return 1;
		return n*arguments.callee(n-1);
	};
console.log(callerdemo(5));</span>
輸出120;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章