Ваша проблема заключается в this
и что она ссылается:
foo: function(){
console.log(this.prop);
(function bar(){
console.log(this.prop); <--- this does not reference to foo here, but instead it refers to the window object
})();
}
Вы должны держать ссылку на внешний this
:
foo: function(){
console.log(this.prop);
var that = this;
(function bar(){
console.log(that.prop); <--- tada!
})();
}
Update
Некоторые пояснения. Это все о том, как JavaScript определяет контекст при вызове функции.
function Test() {
this.name = "Test";
this.bar = function() { console.log("My name is: "+ this.name);}
}
function Blub() {
this.name = "Blub";
this.foo = function() { console.log("My name is: " + this.name);}
}
var a = new Test();
var b = new Blub();
// this works as expected
a.bar(); // My name is: Test
b.foo(); // My name is: Blub
// let's do something fun
a.foo = b.foo; // make an educated guess what that does...
a.foo() // My name is: Test
Да? Разве мы не ссылаемся на method
Blub? Нет, мы не. Мы ссылаемся на несвязанный function
Blub.
JavaScript привязывается к .
(точкам) и основывается на том, что он решает, что значение this
должно быть.
Поскольку вы не вызываете свою анонимную функцию на объект (поэтому нет .
), она будет ссылаться на глобальный объект, который - в случае браузера - объект окна.
Другой пример (можно подумать, что это будет работать):
var str = "Hello World";
var ord = str.charCodeAt; // let's make a little shortcut here.... bad idea
ord(0) // no dot...
Вместо полукокса кодов, которые в str
мы получаем те, которые находятся в глобальном объекте, конечно, это не строка так charCodeAt
звонки toString
, по которым результаты "[object DOMWindow]"
+1 для первого решения! – 2010-11-23 22:17:49