How to get caller from strict mode?

后端 未结 1 1528
轮回少年
轮回少年 2020-12-10 01:07

Strict and non-strict code can be mixed. But you can\'t use caller even if the call to it is not in strict code. Does anybody know any workaround?

I tried this:

相关标签:
1条回答
  • 2020-12-10 02:03

    Here's an evil hack that only works in V8. The 140 bytes version:

    function x(a,b,c){function d(e,f){d=f}c=(b=Error)[a='prepareStackTrace'];b.captureStackTrace(b[a]=d,x);d.stack;b[a]=c;return d}
    

    And the less cryptic version

    if ('captureStackTrace' in Error) {
      void function(){
        function prepare(e, callsites){
          return callsites;
        }
    
        function stack(f){
          var e = {};
          var oldPrepare = Error.prepareStackTrace;
          Error.prepareStackTrace = prepare;
          Error.captureStackTrace(e, f || stack.caller);
          e = e.stack;
          Error.prepareStackTrace = oldPrepare;
          return e;
        }
    
        function lastReceiver(){
          return stack(lastReceiver)[2].receiver;
        }
    
        var CallSite = stack()[0].constructor;
        var callsiteMethods = {};
    
        Object.getOwnPropertyNames(CallSite.prototype).forEach(function(key){
          if (/^is|^get/.test(key)) {
            callsiteMethods[key.replace(/^is|^get/, '')] = CallSite.prototype[key];
          }
          callsiteMethods.location = CallSite.prototype.toString;
        });
    
        CallSite.prototype.resolve = function resolve(){
          for (var k in callsiteMethods)
            this[k] = callsiteMethods[k].call(this);
        }
    
      }();
    }
    
    0 讨论(0)
提交回复
热议问题