Иегуда Кац имеет хорошую запись метода JavaScript Function#call
.Его рецензия должна ответить на ваш вопрос, а также множество дополнительных вопросов.
Когда вы вызываете функцию напрямую, используя общий синтаксис:
var foo = function() {
console.log("foo");
return this;
};
foo(); // evaluates to `window`
Тогда this
внутри вызова функции - что угодноthis
находится вне вызова функции.По умолчанию в браузере this
вне вызовов любой функции - window
.Таким образом, внутри вызова функции, как указано выше, this
также по умолчанию window
.
Когда вы вызываете функцию с использованием синтаксиса вызова метода:
var bar = {
foo: function() {
console.log("foo");
return this;
}
};
bar.foo(); // evaluates to `bar`
Затем this
внутри вызова функции находится объект слева от самого правого периода: в этом случае bar
.
Мы можем смоделировать эту ситуацию, используя call
.
Когда вы устанавливаетеФункция вне объекта, и вы хотите вызвать ее с помощью this
внутри вызова функции, установленного для объекта, вы можете:
var foo = function() {
console.log("foo");
return this;
}
var bar = { };
foo.call(bar); // evaluates to `bar`
Вы также можете использовать эту технику для передачи аргументов:
var foo = function(arg1, arg2) {
console.log("foo");
return arg1 + arg2;
}
var bar = { };
foo.call(bar, "abc", "xyz"); // evaluates to `"abcxyz"`