Why is this in an anonymous function undefined when using javascript in strict mode? I understand why this could make sense, but I couldn't find any concrete answer.
Example:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
Test in a fiddle: http://jsfiddle.net/Pyr5g/1/ Check out the logger (firebug).
It's because, until ECMAscript 262 edition 5, there was a big confusion if people who where using the constructor pattern
, forgot to use the new
keyword. If you forgot to use new
when calling a constructor function in ES3, this
referenced the global object (window
in a browser) and you would clobber the global object with variables.
That was terrible behavior and so people at ECMA decided, just to set this
to undefined
.
Example:
function myConstructor() {
this.a = 'foo';
this.b = 'bar';
}
myInstance = new myConstructor(); // all cool, all fine. a and b were created in a new local object
myBadInstance = myConstructor(); // oh my gosh, we just created a, and b on the window object
The last line would throw an error in ES5 strict
"TypeError: this is undefined"
(which is a much better behavior)