0

Есть такой код:

var f = function() {
    this.x = 5;
    (function() {
        this.x = 3;
    })();
    console.log(this.x);
}

Почему функция внутри функции записывается таким образом:

(function() {
    this.x = 3;
})();

А почему нельзя написать так:

function() {
    this.x = 3;
}

?

Ilnyr
  • 1,301
  • ой как все плохо, а где вы такой код нашли? – Grundy Jul 07 '16 at 12:30
  • Grundy, в хабре нашел такой код. Вот источник: https://habrahabr.ru/post/149516/ – Ilnyr Jul 07 '16 at 12:39
  • Alexey Ten, мой вопрос не очень похож на то, что скинули источником. Т.е. во-первых не дубликат, а во вторых ответы не устраивают. – Ilnyr Jul 07 '16 at 12:48
  • @Ilnyr, нет, в данной редакции ваш вопрос абсолютный дубликат того, который предоставлен по ссылке. Если вопрос подразумевал что-то еще, стоит это добавить – Grundy Jul 07 '16 at 12:51
  • @Ilnyr, кроме того, в приведенной статье вполне себе объясняется, что именно значит данный вызов – Grundy Jul 07 '16 at 12:56
  • 1
    Это да, но у меня же содержит ключевое слово this. Это разве не разные вещи? А в этом источнике что-то не вижу упоминании про this в "обертке" – Ilnyr Jul 07 '16 at 13:13

1 Answers1

-2

Это называется "обертка", вы объявляете функцию и сразу её вызываете. Во втором случае пришлось-бы писать так:

var f1=function(_this) {
    _this.x = 3;
}
f1(this);

Смысл в том, что в "обертке" this принимает не значение самой функции, а значение внешней фунции.

iKest
  • 132
  • почему так пришлось бы писать во втором случае? откуда появился параметр? – Grundy Jul 07 '16 at 12:32
  • что значит в "обертке" this принимает не значение самой функции, а значение внешней фунции.? – Grundy Jul 07 '16 at 12:37
  • Да, тоже интересует подробности насчет последнего абзаца – Ilnyr Jul 07 '16 at 12:50
  • это значит, что обертка использует this родительской области видимости. – iKest Jul 07 '16 at 12:56
  • @iKest, код приведенный в ответе не аналогичен тому, что приведен в вопросе – Grundy Jul 07 '16 at 12:57
  • Не, ну с вопросом-то всё ясно. function() { this.x = 3; } - и дальше что? Фунцию объявили. И как её вызвать? Никак. Обертка (function() {...})() понятно что позволяет сразу вызывать анонимные функции, в callback'ах вообще шикарно. Но я по дурости всегда this пробрасывал внутрь функций. Правда я стараюсь только прототипированные объекты делать. Даже от call/bind в пользу проброса this отказывался. Оказывается вообще контекст не понимаю. Минус 100 в карму и голову пеплом. – iKest Jul 07 '16 at 13:57