Первый случай:
Во первых вы вызываете функцию. А внутри функции сама функция, т.е. f
установлена как this
. Таким образом, в первом примере this.x = 5;
устанавливает свойство x
для функции.
Когда внутренняя функция вызывается this
относится к window
объекту, поэтому this.x = 3;
изменяет свойство x
объекта окна.
Когда он регистрирует console.log(this.x);
, здесь регистрируется то же свойство x
, которое было установлено как свойство функции.
Второй случай:
Во втором примере this
внутри внешней функции относится к window
, поэтому при оценке this.x = 3;
window.x
становится 3
. Как this
относится к window
во внешней функции, так console.log(this.x);
logs window.x
, что 3
Вывод:
Вывод всего обсуждения заключается в том, что если аргумент call()
не передается, тогда объект window
автоматически связывается. Согласно MDN
thisArg
Необязательный. Значение этого предусмотрено для вызова функции. Обратите внимание, что это может не быть фактическим значением, видимым методом: если метод является функцией в нестрогом режиме, null и undefined будут заменены глобальным объектом , а примитивные значения будут преобразованы в объекты .
См. Фрагмент ниже.
function foo(){
console.log(this);
}
foo.call(foo); //foo function
foo.call(); //window object