В функции JavaScript this
устанавливается в зависимости от того, как была вызвана функция.
В вашем примере Obj
, если вы исправите синтаксическую ошибку и используете запятые между свойствами:
var Obj = {
foo : 'value', // needs comma, not semicolon
bar : function() { return this.foo; }
}
Если вы используете синтаксис «точка» на Obj
для вызова функции bar
, тогда this
будет автоматически установлен на Obj
:
Obj.bar(); // this will be Obj
Это простой способубедитесь, что this
настроен так, как вы хотите.Но если вы вызываете функцию каким-либо другим способом, this
может быть установлен на что-то другое:
var nonObjBar = Obj.bar; // get a reference to the function
nonObjBar(); // this will (probably) be `window`, but depends if
// in strict mode or inside some other function, etc
var Obj2 = { foo: "other foo" };
Obj.bar.call(Obj2); // the .call() method sets this to Obj2
// so bar will return Obj2's foo, "other foo"
В этом последнем примере используется метод .call()
для Obj.bar
для вызова функции таким образом, чтобыпозволяет установить this
на что угодно (строгий или нестрогий режим влияет на то, как это работает в некоторых случаях).
Может показаться странным, если вы работаете с такими языками, как Java, но JavaScriptфункции не принадлежат какому-либо данному объекту.Это поведение довольно четко определено и нарочно.