Подтвердить что ты не робот

Зачем писать ".call(this)" в конце анонимной функции javascript?

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

(function() {    

    var a = 1;

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

}).call(this);

sayA();

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

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

4b9b3361

Ответ 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

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