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

dirdir

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

Код:
"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
// без стрикта полюбому можно вызывать

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

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

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

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


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


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