当我在Javascript中有这样的对象时:
var Foo = {
bar: function(location, callback){
var ref = new Firebase(location);
alert(location); // outputs correct, different value when called twice with different locations
ref.on('value', function(remote) {
callback(remote, location);
alert(location); // outputs last value that was given to Foo.bar, set synchronously,
// but when asynchronously getting the value, only last given to Foo.bar() is retrieved
}.bind(this)) // bind to .bar scope
}
}
然后做:
Foo.bar("some/location", function(remote, location){
alert(remote) // "some/location"
});
这将返回一些remote
对象,以及原始的,请求location
(我在本地使用的引用,所以当按照任何顺序调用时,我可以将它们放在右边放在本地客户端)
现在,当我像这样尝试多个Foo.bar
时:
Foo.bar("some/location", function(remote, location){
alert(location) // after callback has responded: "other/location"
});
// some ms have passed, no response/callback from server yet...
Foo.bar("other/location", function(remote, location){
alert(location) // after callback has responded: "other/location"
});
location
变量似乎覆盖了第一个Foo.bar()
,这很奇怪,因为据我所知,变量位于Foo
的私有范围内,不应该被触及?
即使我不这样做:
var Fuu = Object.create(Foo);
据我所知,至少会创建一个完全new Object
,只继承最后设置的变量,但是从它的开始,应该在它自己的范围内。或者我在这里误解了一些基本的东西?或者它是我正在使用的异步Firebase
库?
当我执行以下操作时,继承会有所不同吗?怎么/为什么?
var Foo = function(){
this.bar = function(){
}
}
澄清:在异步调用callback
之后,给予Foo.bar()的最后一个location
变量似乎覆盖了Firebase范围内的第一个变量,而我获取正确的remote
对象,但不是正确的关联location
,它反映了remote
对象在我的客户端代码中应该放在本地的位置。
更新* 我在问题中将Async()
更改为Firebase()
,我实际上正在使用它,但我不认为这是它的错,因为我'我只是传递一个变量,并将其绑定到this
以保持引用,但看起来像因为 Foo.bar
是相同的函数(对象?),它会覆盖它第一个给定的location
变量到Foo.bar
收到的最后一个变量。
更新在问题中添加.bind(this)
,将变量传递给异步函数并使回调函数输出错误
答案 0 :(得分:0)
this
可能会回答我的问题:
https://github.com/getify/You-Dont-Know-JS/blob/master/this%20&%20object%20prototypes/ch1.md
this
实际上是在调用函数时生成的绑定, 它引用的内容完全由call-site在哪里决定 该函数被调用。
这似乎也解释了我对this
约束的误解:
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
var bar = obj.foo; // function reference/alias!
var a = "oops, global"; // `a` also property on global object
bar(); // "oops, global"
任何人都可以确认我的.bind(this)
可能是这种意外行为的解释,文章是否正确?