Это потому, что до выпуска ECMAscript 262, выпуск 5, существовала большая путаница, если люди, которые когда-либо использовали constructor pattern
, забыли использовать ключевое слово new
.Если вы забыли использовать new
при вызове функции конструктора в ES3, this
ссылался на глобальный объект (window
в браузере), и вы бы забили глобальный объект переменными.
Это было ужасноповедение, и поэтому люди в ECMA решили, просто установить this
в undefined
.
Пример:
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
Последняя строка выдаст ошибку в строгом ES5
"TypeError: this is undefined"
(что намного лучше)