原理就是利用Error
, 以及v8特有的API: JavaScript stack trace API.
使用这种方法可以获取到相当多的信息,
比如函数所在的文件的文件名, 行号列号等等...
不过缺点是只有v8支持.
其他浏览器可以利用arguments.caller
来追溯调用栈.
直接上代码:
// hook the prepare function
Error.prepareStackTrace=function(err,stack){
// err: the Error object.
// stack: stack info, an array of `CallSite`.
// return full info of the stack.
return stack;
};
// trace function
function trace(){
var obj={};
Error.captureStackTrace(obj);
// or just use: var obj=new Error();
var stack=obj.stack;
// remove this function from stack
stack=stack.slice(1);
return stack;
}
使用:
(function callee(){
console.assert(trace()[0].getFunction()===callee);
})();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。