Какая причина использования такого синтаксиса (0, _.Em)();

При исследовании скриптов google plusone я видел следующий синтаксис много раз:

(0, _.Em)();

Предполагая, что _.Em - это функция, описанная выше, приведет к вызову этой функции, что довольно очевидно. Если, с другой стороны, это будет undefined, не будет ли результат таким же, как просто _.Em()?

Может ли кто-нибудь пролить свет на то, что идея использования такого синтаксиса?

Ответ 1

В принципе, этот синтаксис позволяет вызывать _.Em() в контексте объекта window вместо _.

Предполагая, что у вас есть этот код:

Foo = function() {
    this.foo = "foo";
};

Foo.prototype.Em = function() {
    alert(this.foo);
};

var _ = new Foo();

Выдача _.Em() приведет к вызову Em() в контексте _. Внутри функции ключевое слово this будет ссылаться на _, поэтому foo будет напечатано.

Выдача (0, _.Em)() отменяет вызов метода от объекта и выполняет вызов в глобальном контексте. Внутри функции ключевое слово this будет ссылаться на window, поэтому undefined будет напечатано, так как window не имеет свойства foo.

Вы можете проверить разницу между двумя синтаксисами в этой скрипте.