Javascript对象继承和异步

时间:2014-07-15 21:20:53

标签: javascript inheritance asynchronous firebase

当我在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),将变量传递给异步函数并使回调函数输出错误

1 个答案:

答案 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)可能是这种意外行为的解释,文章是否正确?