Зачем писать." вызов(это) " в конце анонимной функции javascript? [дубликат]


этот вопрос уже есть ответ здесь:

Я видел JavaScript, написанный так (это было на демонстрации, и у меня нет фактического кода под рукой, но подразумевалось, что это нормально):

(function() {    

    var a = 1;

    this.sayA = function() {
        alert(a);
    }

}).call(this);

sayA();

Я полагаю, что это пишется анонимная функция так, что переменная a не доступен глобально.

какой мог быть смысл .call(this) быть? Поскольку эта функция не была вложенной, this было просто окно. Чем это отличается от простого написания () в конце?

4 54

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 было просто окно. Чем это отличается от простого написания () в конце?

не - не строгого режима:

  1. если код функции является строгим кодом, установите ThisBinding до thisArg.
  2. другое если thisArg и null или undefined, выберите ThisBinding к глобальному объекту.
  3. ...

в строгом режиме,this просто непосредственно устанавливается в заданное значение, которое является undefined для обычного вызова. Таким образом, .call(this) используется для явной передачи глобального объекта. Вы можете попробовать это в консоли:

> (function() { "use strict"; console.log(this); })()
undefined
> (function() { "use strict"; console.log(this); }).call(this)
Window

это может не иметь значения для неаккуратного кода, но это хорошая практика и совместимость с будущим: -)

this переданная функция задает контекст выполнения, поэтому внутри вашей анонимной функции this относится к window.

можно не писать this.alert('');.