Внутри функции this
полностью зависит от того, как вы вызвали функцию.
При вызове функции с использованием точечной нотации из объекта this
будет автоматически установлен на этот объект.
Если вы скажете someObject.someChildObject.someFunction()
, то в пределах someFunction()
вы обнаружите, что this
будет установлено на someChildObject
.
Так что в вашем примере f1.fn()
должно привести к this
, являющемуся f1
в fn()
, но затем в этой функции вы говорите this.state.fn()
- которая вызовет state
'fn()
с this
, установленным в state
.
Вы можете переопределить это поведениеиспользуя call
или apply
.
Другой пример, представляющий интерес для вас:
function F( i, f ) {
this.i = i;
this.state = { 'fn':f };
this.f = f;
};
f1 = new F( 1, function() { console.log( this.i ); } );
f1.f(); // works - 'this' will be f1
var x = f1.f; // create a reference to the same function
x(); // won't work - 'this' will probably be 'window'
Если вы создаете ссылку на функцию, первоначально определенную как свойство объекта, и вызываете функцию черезэта ссылка тогда this
будет тем, что относится к вашей новой ссылке.В моем примере ссылка x
является глобальной, что на практике означает, что она принадлежит объекту window
.Из этого вы можете узнать, что функция, которую f1.f()
вызывает, на самом деле вообще не относится к f1
.
Продолжая этот пример:
f2 = {};
f2.i = "hello";
f2.f = f1.f;
f2.f(); // 'this' will be f2, so should log "hello"
Когда вы звоните f2.f()
, вы обнаружите, что this
имеет значение f2
, и поскольку я установил свойство f2.i
, функция будет регистрировать это свойство.