javascript - the - ¿Cómo obtener la persona que llama desde el modo estricto?
use the function form of use strict (1)
Se puede mezclar código estricto y no estricto. Pero no puede usar la persona que llama aunque la llamada no esté en un código estricto. ¿Alguien sabe alguna solución?
Intenté esto:
(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;
}
Aquí hay un hack malvado que solo funciona en V8. La versión de 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}
Y la versión menos críptica.
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);
}
}();
}