Множество ответов, все с полезной и правильной информацией, но ни один из них не объясняет правильное поведение.
В вашем первом примере он регистрирует только Hello foo
оба раза, поскольку вы создаете переменную self
, который ссылается на объект this
.Эта переменная self
затем закрывается в вашем greeting function
.Следовательно, вы можете вызывать эту функцию так, как хотите, она всегда будет обращаться к self.name
, а не к this.name
, поэтому она всегда одинакова.
Вы не делаете этого в своем примере prototype
.Там вы непосредственно получаете доступ к this.name
, и тогда действительно важно, как вызывается функция (см. Ответ @lwburk).
Опять же, даже если вы называете первый пример как1018 *
foo.greeting.call( window );
он все равно будет обращаться к закрытой переменной self
и журналу Hello foo
.