1

原理就是利用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);
})();

IntPtr
58 声望3 粉丝

I'm here.