mksios mksios - 9 months ago 75
jQuery Question

"use strict"; + jQuery.getScript() = script can't export to global namespace

Suppose I have the following script, called

. After it executes I should have

"use strict";

var globalVar = {};
alert(typeof window.globalVar);

But if I include it from a block of javascript with


The alert says
. Why? What is going on here?

FYI, that's not what happens if I include the file using a script tag:

<script type="text/javascript" src="include_strict.js"></script>

Here, I see the expected alert,
. And if I remove
"use strict";
, then both
have the same effect of displaying

I've created an example ( to demonstrate this.

Answer Source

It uses $.getScript() which uses eval to execute the script which cannot modify the global scope in strict mode:

Second, eval of strict mode code does not introduce new variables into the surrounding scope. In normal code eval("var x;") introduces a variable x into the surrounding function or the global scope. This means that, in general, in a function containing a call to eval every name not referring to an argument or local variable must be mapped to a particular definition at runtime (because that eval might have introduced a new variable that would hide the outer variable). In strict mode eval creates variables only for the code being evaluated, so eval can't affect whether a name refers to an outer variable or some local variable:


The solution is not using jQuery to load the script but appending a script element to the DOM. Note that you cannot even use jQuery to append the element; it will automatically use $.getScript() for it.