В JavaScript функции - это объекты, имеющие два метода для вызова функции:
call(scope, arg1, arg2, ...);
apply(scope, args); // args is an array of arguments to call the function with
Первый аргумент, "scope", - это объект, который связан с "this" внутри функции. Итак, следующие примеры эквивалентны:
obj.method(1, 2, 3);
obj.method.call(obj, 1, 2, 3);
obj.method.apply(obj, [1, 2, 3]);
В первом примере вы вызываете функцию, переданную o.f (), используя 'o' в качестве области действия:
var o = {f: function(fn) {
fn.call(o);
}};
Поэтому ваша функция передается в 'ob', ссылаясь на 'o' так:
var ob = {f: function() {
o.f(function() {
this.x = 2; //HERE: how can this reference ob?
//ob.x = 2;
});
}};
В строке «ЗДЕСЬ» на самом деле это «о».
Вы можете попробовать следующее:
var ob = {f: function() {
var self = this;
o.f(function() {
self.x = 2; // self is ob now
});
}};
Или вы можете изменить функцию 'o.f', чтобы получить параметр области действия:
var o = {f: function(fn, scope) {
fn.call(scope || this); // Uses the given scope or this (= 'o') if no scope is provided
}};
Тогда вы можете передать «this» в «ob»:
var ob = {f: function() {
o.f(function() {
this.x = 2; // 'this' will be the 'outer' this
}, this); // Here: this as scope
}};