Вы просто используете Оператор запятой .
Этот оператор оценивает свои операнды только слева направо и возвращает значение из второго, например:
(0, 1); // 1
('foo', 'bar'); // 'bar'
В контексте вызова функции вычисление операнда просто получит значение, а не ссылку, это приводит к тому, что значение this
внутри вызываемой функции указывает на глобальный объект (или оно будет * 1009). * в новом строгом режиме ECMAScript 5).
Например:
var foo = 'global.foo';
var obj = {
foo: 'obj.foo',
method: function () {
return this.foo;
}
};
obj.method(); // "obj.foo"
(1, obj.method)(); // "global.foo"
Как видите, первый вызов, который является прямым вызовом, значение this
внутри method
будет правильно относиться к obj
(возвращающему "obj.foo"
), второй вызов, оценка, выполненная оператор запятой заставит значение this
указывать на глобальный объект (получая "global.foo"
).
Этот шаблон стал очень популярным в наши дни, чтобы делать косвенные вызовы eval
, это может быть полезно в строгом режиме ES5, например, для получения ссылки на глобальный объект ( представьте, что вы находитесь в небраузерной среде, window
недоступно):
(function () {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
})();
В приведенном выше коде внутренняя анонимная функция будет выполняться в кодовом блоке строгого режима, в результате чего значение this
будет равно undefined
.
Оператор ||
теперь будет принимать второй операнд, вызов eval
, который является косвенным вызовом, и он будет оценивать код в глобальной лексической и переменной среде.
Но лично в этом случае в строгом режиме я предпочитаю использовать конструктор Function
для получения глобального объекта:
(function () {
"use strict";
var global = Function('return this')();
})();
Функции, созданные с помощью конструктора Function
, являются строгими, только если они начинаются с директивы Use Strict, они не «наследуют» строгость текущего контекста, как это делают объявления функций или выражения функций.