Зачем писать." вызов(это) " в конце анонимной функции 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
это может не иметь значения для неаккуратного кода, но это хорошая практика и совместимость с будущим: -)