javascript 如何从严格模式获取调用者?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9777905/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-26 07:48:36 来源:igfitidea点击:
How to get caller from strict mode?
提问by Quadroid
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?
严格和非严格代码可以混合使用。但是即使调用不是严格的代码,您也不能使用 caller。有人知道任何解决方法吗?
I tried this:
我试过这个:
(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;
}
回答by Quadroid
Here's an evil hack that only works in V8. The 140 bytes
version:
这是一个仅适用于 V8 的邪恶黑客。该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}
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);
}
}();
}