Stasgar
@Stasgar
Обученная макака

Вызов «obj.func()» или" (obj.func)()", есть ли различия?

var obj = {
  func: function() {
    alert('bauh')
  }
};

obj.func();
(obj.func)();


Что означает второй вариант записи, как он работает? И есть ли разница между ними?

Я понимаю, что obj.func - возвращает функцию, тогда сам-собой кроме варианта записи отличий я не вижу, но может быть есть ситуации, где используют второй вариант?
  • Вопрос задан
  • 319 просмотров
Решения вопроса 3
Lynn
@Lynn
nginx, js, css
Именно в таком виде разницы нет. Но, скорее всего такой код встречается в виде (0, obj.func)() или (obj.func || _.noop)()

И в этих случаях есть разница:

let obj = {
    func: function() {
        console.log(this === obj);
    }
};

obj.func(); // -> true
(obj.func)(); // -> true
(0, obj.func)(); // -> false
(obj.func || _.noop)(); // -> false


https://learn.javascript.ru/object-methods
Ответ написан
obj.func - возвращает функцию

Верно.

где используют второй вариант?

Например, когда нужно, чтобы анонимная функция-обертка выполнилась сразу же после своего объявления. Так часто поступают разработчики плагинов для jQuery, т.к. им необходимо инкапсулировать код плагина, передав в его область видимости некоторые переменные и константы.
(function($, window, document, undefined) {
    // ...
})(jQuery, window, document, undefined);
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
В данном случае разницы нет и смысла в такой записи нет. Но надо понимать, что делает оператор () (помимо вызова функции, и, очевидно, группировки в арифметических операциях). А делает он вот что: вычисляет выражение и возвращает его. Это позволяет не создавать временные переменные на каждый чих и писать такие вещи:
(obj1 || obj2).func() // вызывает obj2.func, если obj1 null, undefined, false и т.д.

options || (options = {}) // сделает options пустым объектом, 
// если он null, undefined, false, часто использовалось для задания значения по умолчанию до ES2015


Без скобочек получилось бы чуть длиннее:
var obj = obj1 || obj2;
obj.func();

if (!options) {
    options = {}
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
Никакой разницы.
Второй способ хорош для функционального стиля, когда можно написать что-то вроде
(obj.func || _.noop)();

DEMO.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы