1. 程式人生 > >js arguments.callee和caller用法

js arguments.callee和caller用法

 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是返回本身自己的函式