Зачем писать ".call(this)" в конце анонимной функции javascript?
Я видел, что JavaScript написан так (это было на демонстрации, и у меня нет фактического кода под рукой, но подразумевалось, что это было нормально):
(function() {
var a = 1;
this.sayA = function() {
alert(a);
}
}).call(this);
sayA();
Я предполагаю, что она написана анонимной функцией, так что переменная a
не доступна глобально.
Какова могла бы точка .call(this)
? Поскольку эта функция не была вложенной, this
был только окном. Чем это отличается от написания ()
в конце?
Ответы
Ответ 1
Попробуйте следующее:
function Foo() {
(function () {
console.log(this);
// > Foo
}).call(this);
(function () {
console.log(this);
// > undefined in strict mode, or Window in non strict mode
})();
}
var bar = new Foo;
Итак, если по какой-либо причине вы используете это, это способ сделать IIFE действовать так, как если бы это была функция-член Foo
, особенно при создании экземпляров определенного пользователем типа объекта.
Ответ 2
Мне было интересно об этом, так как я только что видел, как Джон Ресиг говорил о этом видео. У Yoshi был отличный ответ, но мне пришлось немного проверить его в консольном журнале, и я подумал, что эта модификация его ответа может помочь некоторым людям, которые сначала испытывали проблемы, такие как я:
function Foo() {
this.foo = true;
(function () {
console.log("Foo = " + this.foo);
// Outputs undefined
}());
(function () {
console.log("Foo = " + this.foo);
// Outputs true
}).call(this);
(function () {
console.log(this);
// Outputs undefined in strict mode, or Window in non strict mode
// Anonymous functions usually default to the global scope
})();
}
var bar = new Foo;
Мне просто показалось, что я вижу первый и второй бок о бок, показывая, что .call(это) по существу дает вам возможность передать текущий контекст анонимной функции.
Спасибо за вопрос и спасибо Йоши за четкий ответ!
Ответ 3
this
, переданный функции, задает контекст выполнения, поэтому внутри вашей анонимной функции this
относится к window
.
Вы можете написать this.alert('');
.
Ответ 4
Поскольку эта функция не была вложенной, this
был только окном. Чем он отличается от написания ()
в конце?
Нет - не в строгом режиме:
- Если код функции является строгим кодом, установите для параметра
ThisBinding
значение thisArg
. - Else, если
thisArg
- null
или undefined
, установите ThisBinding
в глобальный объект. - ...
В строгом режиме this
просто устанавливается на заданное значение, которое undefined
для обычного вызова. Поэтому .call(this)
используется для передачи глобального объекта явно. Вы можете попробовать это в консоли:
> (function() { "use strict"; console.log(this); })()
undefined
> (function() { "use strict"; console.log(this); }).call(this)
Window
Это может не повлиять на неаккуратный код, но это хорошая практика и будущая совместимость: -)