2015-04-27

Javascript 的 caller 屬性

有些書說隱藏版屬性 arguments 有個 caller 屬性,但我怎麼也找不到,倒是在 Function 裡找到這個屬性。

官方定義 caller:呼叫目前正在執行的 function 的 function,簡言之就是,誰呼叫這個 function。
function a() {
  return a.caller === b; // 一定要用 function name 去呼叫 caller
}
function b() {
  return a();
}
console.log(b()); // true
caller 主要用途是追蹤呼叫堆疊,即追蹤 function invoke chain。

function stack() {
  var s = [];
  for (var c = stack.caller; c; c = c.caller) {
    s.push(c.prototype);
  }
  return s;
}
function a() {
  return stack();
}
function b() {
  return a();
}
function c() {
  return b();
}
console.log(c()); // [a, b, c] // c 呼叫 b,b 呼叫 a,a 呼叫 stack 
不過最重要的是,caller 不是標準,雖然大部分 Javascript engine 有實做,但最好還是不要用。

另外在 ECMAScript 5 的 strict mode,caller 屬性在是禁止使用的。
---
---
---

沒有留言:

張貼留言