Comment obtenir l'appelant en mode strict?

Un code strict et non strict peut être mélangé. Mais vous ne pouvez pas utiliser l'appelant même si l'appel n'est pas dans un code strict. Est-ce que quelqu'un connaît une solution de contournement?

J'ai essayé ceci:

(function strict(){ "use strict"; nonStrict();//ok nonStrictCaller();//error :( })(); function nonStrict(){ return 011;//Octal literals are not allowed in strict mode } function nonStrictCaller(){ return nonStrictCaller.caller; } 

Voici un hack malveillant qui ne fonctionne que dans V8. La version des 140 bytes :

 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} 

Et la version moins cryptique

 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); } }(); }