Проблема с определением контекста this

98
09 мая 2021, 18:40

var f = function() { 
    this.x = 5; 
    (function() { 
        this.x = 3;  
    })(); 
    console.log(this.x);  
}; 
 
var obj = {x: 4,  
    m: function() { 
        console.log(this.x);  
    } 
}; 
 
obj.m.call(f) //--> undefined

Почему в данном случае вернется undefined, а не 5?

Answer 1

Потому что в call ты в качестве аргумента передаешь объект, который и будет this в вызываемой функции. А здесь ты передаешь функцию. Функция - это тоже объект, но у нее нет свойства x, поэтому возвращается undefiened.

Я не совсем понимаю, что ты хочешь сделать, но чтобы получить 5, передавая функцию, ты можешь сделать так.

  1. Самой функции назначить свойство x (функции - это тоже объекты, так что так можно сделать).

    var f = function() {};
    f.x = 5;
  2. Вернуть из функции объект со свойством x и передать в call не функцию, а вызов функции.

    var f = function() {
      return { x: 5};
    };
    //Твой код
    obj.m.call(f())
READ ALSO
Непонятное поведение программы на C++ [закрыт]

Непонятное поведение программы на C++ [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

94
Какая сделать явную специализацию для функции?

Какая сделать явную специализацию для функции?

Какая сделать явную специализацию для функции foo оставив const T* arr??

108
SFML, растягивание спрайтов вместе с окном

SFML, растягивание спрайтов вместе с окном

Что нужно сделать, чтобы спрайт не растягивался в месте с окном?

83