I got some JS Code that gets inside a random Anonymous js function.
I want that code (for example alert('hello')
) to dump/alert
the entire script block/object which it was injected into.
kinda like document.body.innerHTML but for the anonymous function block
result should be like :
Function()({ somecode; MyAlert(...) } )()
or
Try { some code; mycode; } catch(e) { }
3 Answers 3
Mind your terms. "(browser) script block" literally means script element's code by the spec. Use "javascript block" or "javascript object" to mean a block or an object. Do not create confusing new terms; do read and research.
Blocks are not objects; they are language statements. Just like you cannot "get the code/variables of current line", you cannot "get the code/variables of current block", try block or not.
Stepping back, for now you can use
Function.caller
to get the function calling your code:
var mycode = function me(){ if ( me.caller ) alert( me.caller.toString() ); };
(function(){ var some = 'code'; mycode(); })();
// Alert "function(){ var some = 'code'; mycode(); }", even when it is anonymous
Note that you get the whole function's code, not the function block's code which excludes parameters and function name.
Function.caller may be removed in future, like
arguments.caller
. (Both are troubles. What if a cross origin function on the call stack contains private api key code? How should js engines inline your code?)When the time comes, or when caller is null (when it is global code), you may still be able to get textual stacktrace (
new Error().stack
) and current script element (document.currentScript
), but their capabilities are pretty limited.You can get a script element's code - if any - with its textContent or innerHTML property.
Your question sounds like an XY Problem. You want to do something that no modern language is meant to do, but never say for what purpose. Try to describe your real problem.
1 Comment
Functions have a toString()
method. (Yes functions have methods!)
var fn = function() { alert('hello') };
fn.toString() // "function() { alert('hello') };"
So you can alert it:
alert(fn.toString());
You can log it to the js console:
console.log(fn.toString());
Or even write it to the page.
document.getElementById('someID').innerHTML = fn.toString();
However, this won't work for every function in the universe.
[].push.toString()
"function push() { [native code] }"
Some functions are not implemented with javascript, but in the compiled code of the browser or JS engine. For these environment provided functions, you will get this above less helpful output.
11 Comments
toString()
on it. Regardless of how it was declared.If you're not in strict mode you can go up the stack from something which was referenceable (i.e. a named function expression) using (non-standard) .caller
function getFunctionReference(callback) {
var ref = getFunctionReference.caller;
if (callback) callback(ref);
return ref;
}
Now you can do things like
(function () {
getFunctionReference(alert);
}());
// alerts the .toString of the IIFE
This only works for functions, you can't do this on top level code.
The best way to explore your code is actually with the Console, and you can use the debugger;
statement or breakpoints to follow exactly what is happening and when.
alert(arguments.callee);
.arguments
object is created for that invocation. So, you are either in global code, or thearguments
object was manually overwritten.)