The question is still not clear, please rewrite it like: 1. I do X. 2. I expect Y. 3. But I get Z. ---------- Update: ======= From the comments: Apparently the OP's problem really was that accessing `StackExchange.options.routeName` in the script, outside the injected code, caused a ReferenceError, **when using Scriptish**, not Tampermonkey and Greasemonkey as stated in the question. This is because Scriptish does not yet break the sandbox the same way that Greasemonkey and Tampermonkey do in `@grant none` mode. Solutions in decreasing order of preference/robustness: - Don't use `@grant none` mode if you can help it. Keep script code sandboxed or inject it. - Inject all code that depends on the target page's javascript. - Don't use Scriptish for code needing `@grant none` until such time as Scriptish more fully emulates the abysmal design decisions that Greasemonkey made with `@grant`. ---------- Old answer, may be useful to any others with similar problems: ============================================================== - The question's current code seems to work as expected on both browsers (Using Tampermonkey on Chrome). - A `setTimeout` or AJAX tricks don't seem to be needed to wait for, or access, that object. - If you mean that you can't use `start_up` from the console, that's the nature of the particular `with_jquery()` function being used. It wraps your function in parentheses `()` which effectively makes it anonymous. I recommend never doing jQuery that way from a userscript. 99% of the time, use `@require` and a `@grant` setting other than `none`. On friendly, jQuery powered pages, where heavy interaction with page objects is desired (like Stack Exchange sites), use the page's jQuery like this: // ==UserScript== // @name (SE) Inspect global object // @match *://*.stackoverflow.com/* // @match *://*.stackapps.com/* // @grant none // ==/UserScript== //var start_up = function( $ ) { // BAD function start_up ( $ ) { // GOOD console.log ( "===> ", typeof StackExchange.options.routeName, StackExchange.options.routeName ); }; withPages_jQuery (start_up); function withPages_jQuery (NAMED_FunctionToRun) { //--- Use named functions for clarity and debugging... var funcText = NAMED_FunctionToRun.toString (); var funcName = funcText.replace (/^function\s+(\w+)\s*\((.|\n|\r)+$/, "$1"); var script = document.createElement ("script"); script.textContent = funcText + "\n\n"; script.textContent += 'jQuery(document).ready( function () {' + funcName + '(jQuery);} );'; document.body.appendChild (script); }; This allows you to see your function (`start_up`) and use or debug it from the console.