Вызов функций

Тема в разделе "JavaScript", создана пользователем dirdir, 5 апр 2018.

Модераторы: ZiX
  1. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    102
    Симпатии:
    12
    Объясните пожалуйста отличия в этих вызовах функций. Спасибо.

    Код:
    "use strict"
    var foo, bar;
    foo = {
      bar: function() { console.log(this); }
    };
    foo.bar();            // 1  тут всё понятно
    (foo.bar)();          // 2  влияют ли скобки на что-то?
    //(f = foo.bar)();    // 3  так нельзя вызвать в стрикте.  Без стрикта можно.  Почему?
    (foo.x || foo.bar)(); // 4  -  Undefined в стрикте. Без стрикта выводит window
    // без стрикта полюбому можно вызывать
    Спасибо
     
  2. Freeman08

    Freeman08 Создатель

    Регистр.:
    27 сен 2008
    Сообщения:
    28
    Симпатии:
    4
    Все дело в стрикт. Она создна для того, чтобы обезопасить разработчика от потенциальных "подводных камней", неявных ошибок, которые можнро допустить при разработке.

    Я могу ошибаться, но я понимаю этот код так:

    (foo.bar)(); - мне не известно о различиях, возможно в каких то условиях разная область видимости. Аналогом этой записи выступает. Во вторых скобках передаются аргументы для безимянных функций:

    Код:
    (function(a) {
      console.log('Значение а: ' + a); // выведет 2
    })(2)

    (f = foo.bar)(); - Скорей всего потому что переменная f не определена. Вообще в первых скобка должная быть немедленно вызываемая функция. В случае с (foo.bar)(); не падает, потому что foo.bar - функция и компилятор ее вызывает немедленно
    (foo.x || foo.bar)(); - Вообще то это все записи немедленно вызываемой функции и в первых скобках нужно передавать функцию, а не результат условия. Падает в ошибку скорей всего потому что foo.x не обьявлен и стрикт, для того чтобы обезопасить разработчика от нестабильного поведения кода выбрасывает ошибку. Вообще то, насколько я понимаю данная запись сама по себе не корректна.


    п.с. похоже на вопросы с какого то собеседования :)