function func() {
//'use strict'; 严格模式下,下面的语句会报错
console.log(arguments.callee, arguments.caller);
}
function sayHi() {
func();
}
sayHi(); // [Function: func] undefined
// 简易的栈追踪
function traceStack() {
var stack = [];
for(var f = traceStack.caller; f; f = f.caller) {
stack.push(f);
}
return stack;
}
function f1() {
return traceStack();
}
function f2() {
return f1();
}
console.log(f2()); // [ [Function: f1], [Function: f2]](chrome浏览器环境下)
// 递归的调用将会进入一个死循环
function f3(n) {
return n === 0 ? traceStack() : f3(n-1);
}
console.log(f3(1)); // infinite loop 死循环
谨记
避免使用非标准的arguments.caller和arguments.callee属性,因为它们不具备良好的一移植性。
避免使用非标准的函数对象call属性,因为在包含全部栈信息方面,它是不可靠的。
参考资料:https://lee134134134.github.io/page/6/
-
Previous
每天一个前端知识(59):不要信赖函数的对象的toString方法 -
Next
每天一个前端知识(61):理解prototype,getPrototypeOf和__proto__之间的不同)