Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javascript "use strict" and Nick's find global function

So I saw a function that was, quite frankly beautiful in its simplicity as it allowed you to find the global object ( which depending on environ at the time may NOT have been window ) while within an anonymous function; however when you throw javascripts' "use strict"; mode it crumbles, due to the evaluation of the keyword 'this' changing. There were a few ways to accomplish this?

(function () {
    var win = function () {
        return (function () {
                return this;
            }());
        };
    //win now points to the global object no matter where it is called.
}());

Now, if these are called within the context of "use strict" we lose the functionality described, is there any equivalent that can be done in ES5 strict mode?

For reference

(function () {
    "use strict"
    //code here is in strict mode
}())
like image 570
Akidi Avatar asked Sep 02 '11 23:09

Akidi


3 Answers

Access to the Global Object (before ES5)

If you need to access the global object without hard-coding the identifier window, you can do the following from any level of nested function scope:

var global = (function () {
    return this;
}());

This way you can always get the global object, because inside functions that were invoked as functions (that is, not as constrictors with new) this should always point to the global object.

This is actually no longer the case in ECMAScript 5 in strict mode, so you have to adopt a different pattern when your code is in strict mode.

For example, if you’re developing a library, you can wrap your library code in an immediate function (discussed in Chapter 4) and then from the global scope, pass a reference to this as a parameter to your immediate function.

Access to the Global Object (after ES5)

Commonly, the global object is passed as an argument to the immediate function so that it’s accessible inside of the function without having to use window: this way makes the code more interoperable in environments outside the browser:

(function (global) {
    // access the global object via `global`
}(this));

“JavaScript Patterns, by Stoyan Stefanov (O’Reilly). Copyright 2010 Yahoo!, Inc., 9780596806750.”

like image 129
user278064 Avatar answered Nov 10 '22 02:11

user278064


Solution:

var global = Function('return this')();

Works in all Browsers, Engines, ES3, ES5, strict, nested scope, etc.

A slight variation will pass JSLINT:

var FN = Function, global = FN('return this')();

Discussion

See How to get the global object in JavaScript?

like image 42
coolaj86 Avatar answered Nov 10 '22 03:11

coolaj86


Here's a snippet from Perfection Kills, using global eval.

var root = (function () {
    return this || (0 || eval)('this');
}());

ECMA3, ECMA5, Strict mode, etc compatible, passes JSLint.

like image 1
nickf Avatar answered Nov 10 '22 03:11

nickf