js arguments.callee和caller用法
阿新 • • 發佈:2019-01-12
arguments:
含義:該物件代表正在執行的函式和呼叫它的函式的引數。
語法:
[function.]arguments[n]
引數:function :當前正在執行的 Function 物件的名字。
n :要傳遞給 Function 物件的從0開始的引數值索引。
說明:在前面執行上下文的學習過程中,知道生成執行上下文需要兩個階段,分別是進入執行上下文和執行階段。在其中的進入執行上下文階段中,需要做三個工作,其中一個工作是建立幷初始化AO,即arguments物件。
Arguments Objects 是函式上下文裡的啟用物件AO中的內部物件,它包括下列屬性:
callee:指向當前函式的引用
length: 真正傳遞的引數的個數
properties - indexes:就是函式的引數值(按引數列表從左到右排列)
{
function add(a, b) {
console.log(arguments.callee);
return a + b;
}
add(3, 4);
}
從結果可以看到,callee是一個指標,指向擁有這個arguments物件的函式。
有一個例子階乘
{
function fac(num) {
if (num <= 1) { //0的階乘也是1
return 1;
}
else {
return num * fac(num - 1);
}
}
// 當出現這種情況時,
var trueFac = fac;
fac = function (num) {
return 0;
};
console.log(trueFac(10));
}
上面的案例有一個問題,結果為0
所以
{ function fac(num) { if (num <= 1) { //0的階乘也是1 return 1; } else { return num * arguments.callee(num - 1); } } var trueFac = fac; fac = function (num) { return 0; }; console.log(trueFac(10)); }
arguments.callee指向arguments物件的擁有函式引用,當把fac的函式引用賦給trueFac後,arguments物件的擁有函式變成了trueFac,所以結果是正確的。
2. caller
caller與callee不同,caller屬性並不屬於arguments物件,它是函式物件的屬性,Opera的早期版本不支援,這個屬性儲存著呼叫當前函式的函式的引用。
{
var a = function () {
console.log(a.caller);
}
var b = function () {
a();
}
b();
}
{
function outer() {
inner();
}
function inner() {
console.log(inner.caller);
}
outer();
}
從結果可知,因為outer()呼叫了inner() ,所以inner.caller就指向outer()
總結:caller是返回呼叫該函式的引用
callee是返回本身自己的函式