Когда функция вызывается следующим образом
klass(6); //called function invocation
this
будет установлен как глобальный объект, или, если вы находитесь в строгом режиме, undefined
В результате первый пример (без new
) вернет глобальный объект с новым свойством a
. В строгом режиме он выдаст ошибку, поскольку this
будет установлен на undefined
, и вы не можете добавить свойство a
к undefined
.
Когда вы вызываете функцию с new
new klass( 9 ); //called constructor invocation
значение this
устанавливается для нового объекта и неявно возвращается из функции - нет необходимости говорить return this
Для полноты, когда вы вызываете функцию как метод объекта:
foo.method(); //called method invocation
this
будет установлено для объекта - foo
в этом случае.
И когда вы вызываете функцию с apply (или вызовом)
method.apply(foo) //called apply invocation
this
устанавливается на то, что вы укажете - foo
снова
EDIT
Я упомянул strict mode
в своем ответе. Страница использует строгий режим, если она имеет
"use strict"
в самом верху.