это функция JavaScript, когда вызывается из другого объекта - PullRequest
0 голосов
/ 13 октября 2018

Из того, что я прочитал и понял, контекст выполнения (этой) функции не имеет ничего общего с тем, где она объявлена, а с того места, где она была вызвана (вызов сайта).Рассмотрим 2 случая, когда foo определяется в глобальном контексте -

//1.
function foo(){ console.log(this); }

var obj = {
    x: foo,
};

obj.x(); //prints obj because foo was called "on" obj object

//2.
function foo(){ return this; }

var obj = {
    x: function(){ console.log(foo()); },
};

obj.x(); //prints window object.

У меня путаница во втором случае.Хотя я понимаю, что контекст для функции x - это obj, я не могу понять, почему foo был вызван на оконном объекте из функции x (чей контекст на самом деле является obj)?Уверен, что есть много вопросов на эту тему, я не смог найти что-то похожее на этот пример.Спасибо.

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Я постараюсь дать краткий ответ:

Контекстом функции обычно является объект, которому она назначена.Поскольку во втором случае foo не объявляется как свойство объекта, его контекст является глобальным (оконным) объектом.

Если вы хотите передать объект в качестве контекста foo, вы должны вызвать его с помощью foo.call (это, ... параметры) или с помощью foo.apply (это, параметры), или вы можете создать переменную с функцией, связанной с объектом:

const myFoo = foo.bind(this);
myFoo(...parameters);

Здесь это статья с расширенным объяснением.

0 голосов
/ 13 октября 2018

Как объясняют другие ответы и комментарии: ваш контекст выполнения НЕ привязан к obj, когда foo вызывается как таковой.Поскольку вы ожидаете, что это произойдет, вы можете вместо этого сказать:

foo.call(obj) 

В основном вы связываете this в пределах foo с объектом obj, который является первым аргументом.

Больше на MDN

0 голосов
/ 13 октября 2018

Во втором случае функция, назначенная x внутри obj объекта, вызывается из контекста obj, вы можете проверить это, зарегистрировав this внутри этой функции.

var obj={
    x:function() {
        console.log(this);     // prints obj
        console.log(foo());
      }
}

но когда вы вызываете foo изнутри этой функции, она не имеет никакого вызывающего контекста, вы просто вызываете ее, как если бы вы вызывали любую другую функцию, определенную в глобальном контексте и внутри любой глобально определенной функции, thisотносится к window объекту и, следовательно, вы печатаете window на консоли при входе в систему this внутри foo.

...