Да, вы должны сохранить контекст:
var log;
if (window.console && typeof console.log === "function"){
// use apply to preserve context and invocations with multiple arguments
log = function () { console.log.apply(console, arguments); };
} else {
log = function(){ return; }
}
Что происходит, так это то, что контекст (значение this
) неявно устанавливается при вызове функции, например:
var obj = {
method: function () { return this; }
};
obj.method() === obj; // true
В этом случае вы вызываете функцию, которая определена как свойство объекта, при вызове функции этому объекту присваивается значение this
.
Теперь, как в вашем примере, если вы скопируете ссылку на этот метод в переменную:
var method = obj.method;
method() === window; // global object
Как видите, значение this
относится к глобальному объекту.
Итак, чтобы избежать этого неявного поведения, вы можете установить контекст явно с помощью функций call
или apply
.