В целом нет "явного" связывание this
. Значение определяется всякий раз, когда функция вызывается в зависимости от характера вызова. Это не имеет никакого отношения к обстоятельствам «рождения» функции.
Когда функция вызывается после того, как его ссылка обнаружен с помощью поиска свойства объекта, например:
obj.someFunction();
то ссылка на объект участвует (obj
, выше) будет значение this
в этом конкретном вызове функции. Однако ссылка функции легко могут быть скопированы на другой объект:
var otherObj = { someFunction: obj.someFunction };
otherObj.someFunction();
Теперь значение this
(в этом конкретном вызове) будет ссылка на otherObj
, а не obj
.
Если ссылка на функции копируется в обычной переменной:
var func = obj.someFunction;
func();
значение this
в , что вызов будет ссылка на window
или undefined
если код случается в «строгий» контекст.
Через все это, заметим, что тот факт, что функция, возможно, первоначально был объявлен как значение свойства в объекте буквального не имеет ничего к тому, что заканчивает тем, что значение this
в вызове.
способ создать явный «привязку», чтобы воспользоваться встроенным в .call()
или .apply()
методов, доступных для каждого экземпляра функции:
function whatever() { /* ... */ }
var objWhatever = function() {
whatever.call(obj);
};
Это установка явно вынуждает ссылку obj
использоваться как значение this
в вызове функции whatever()
. Вы также можете использовать встроенный (в современных условиях) .bind()
функцию, чтобы создать «связанную» функцию такой:
var objWhatever = whatever.bind(obj);
лично я постеснялся бы назвать это «связанной» функции, потому что под одеялом, это просто явный вызов через .call()
, но терминология не то, о чем я беспокоюсь о тоже много. :)
Значение 'this' зависит от * как * функция * называется *. Существует несколько способов вызова функции и, следовательно, несколько способов, как «это» получает свое значение. Все это хорошо объяснено в документации MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this. Функция может быть явно привязана через '.bind()', и в этом случае значение 'this' больше не может быть изменено. –
@FelixKling благодарит, но не совсем то, что я просил. – shmuli
Тогда, я думаю, я не понимаю, о чем вы спрашиваете. –