Оператор запятой оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.
console.log((1, 2)); // Returns 2 in console
console.log((a = b = 3, c = 4)); // Returns 4 in console
Итак, давайте посмотрим на пример:
var a = {
foo: function() {
console.log(this === window);
}
};
a.foo(); // Returns 'false' in console
(0, a.foo)(); // Returns 'true' in console
Теперь в foo
методе this
равно a
(потому что foo
прикреплено к a
). Поэтому, если вы позвоните a.foo(
напрямую, он войдет false
в консоль.
Но, если вам позвонят (0, a.foo)()
. Выражение (0, a.foo)
будет оценивать каждый из своих операндов (слева направо) и возвращает значение последнего операнда. Другими словами, (0, a.foo)
эквивалентно
function() {
console.log(this === window);
}
Поскольку эта функция больше ни к чему не привязана, this
это глобальный объект window
. Вот почему он входит true
в консоль при вызове (0, a.foo)()
.
_b.a.call()
это, чтобы прояснить намерение.