Почему свойства не определены после использования функции связывания (javascript)? - PullRequest
0 голосов
/ 09 декабря 2018

Вот ссылка на MDN-объяснение function.prototype.bind () - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

Я добавил несколько console.logs, чтобы помочь мне понять, что происходит.

var module = {
    x: 42,
    getX: function() {
        return this.x;
    }
};

var boundGetX = module.getX.bind(module);

console.log(boundGetX());
console.log(boundGetX().x);
console.log(boundGetX.x);

Первый файл console.log возвращает

42

Для меня это имеет смысл.

Однако второй и третий console.logs возвращают

undefined

Почемутот?Как функция может видеть и регистрировать свойство модуля x с его сохраненным значением 42, и все же значение boundGetX для x не определено?

После использования функции связывания boundGetX не указывает теперь на module.getX И переменная 'this' указывает на модуль?

Почему бы boundGetX.x не указать module.x?И как он может успешно регистрировать значение module.x, когда boundGetX.x не определено?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Метод bind () создает новую функцию, которая при вызове имеет ключевое слово this , установленное на предоставленное значение , с заданной последовательностью аргументов, предшествующей любомупредоставляется при вызове новой функции.

функция связывания меняет значение this, и в вашем случае вы устанавливаете module для разрешения как this в вашемgetX function:

getX: function() {
   return this.x;   // <-- this is now `module` object so `x` resolves to 42
}

Вот почему console.log(boundGetX()); теперь печатает 42, поскольку вы по сути печатаете module.x с помощью функции module.getX.

Теперь эти два:

console.log(boundGetX().x);
console.log(boundGetX.x);

Больше не имеет смысла, поскольку вы связали boundGetX с функцией getX, и эта функция не имеет свойства x и не возвращает свойство x, она просто возвращает значение х .

0 голосов
/ 09 декабря 2018

Когда вы звоните:

console.log(boundGetX().x);

Вы, по сути, звоните:

this.x.x

Что на самом деле делает:

(42).x // there's no property x on the number 42

И поскольку у свойства x нет свойства x, это undefined.

...