Зачем писать." вызов(это) " в конце анонимной функции javascript? [дубликат]
этот вопрос уже есть ответ здесь:
Я видел JavaScript, написанный так (это было на демонстрации, и у меня нет фактического кода под рукой, но подразумевалось, что это нормально):
(function() {
var a = 1;
this.sayA = function() {
alert(a);
}
}).call(this);
sayA();
Я полагаю, что это пишется анонимная функция так, что переменная a не доступен глобально.
какой мог быть смысл .call(this) быть? Поскольку эта функция не была вложенной, this было просто окно. Чем это отличается от простого написания () в конце?
4 ответа:
попробуйте это:
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, особенно при создании экземпляров пользовательского типа объектов.
мне было любопытно об этом, а также я только что видел разговор Джона отставки о видео. У Йоши был отличный ответ, но мне пришлось немного проверить его в журнале консоли, чтобы понять, и я подумал, что эта модификация его ответа может помочь некоторым людям, которые сначала испытывали проблемы, как я:
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;Мне просто было немного больше смысла видеть первый и второй бок о бок, показывая это .вызов (это) по существу дает вам возможность передать текущий контекст для анонимной функции.
Спасибо за вопрос и спасибо Йоши за четкий ответ!
так как эта функция не была вложенной,
thisбыло просто окно. Чем это отличается от простого написания()в конце?не - не строгого режима:
- если код функции является строгим кодом, установите
ThisBindingдоthisArg.- другое если
thisArgиnullилиundefined, выберитеThisBindingк глобальному объекту.- ...
в строгом режиме,
thisпросто непосредственно устанавливается в заданное значение, которое являетсяundefinedдля обычного вызова. Таким образом,.call(this)используется для явной передачи глобального объекта. Вы можете попробовать это в консоли:> (function() { "use strict"; console.log(this); })() undefined > (function() { "use strict"; console.log(this); }).call(this) Windowэто может не иметь значения для неаккуратного кода, но это хорошая практика и совместимость с будущим: -)