Javascript传递函数,存储其引用,将其值更改为另一个函数

时间:2014-09-18 10:29:56

标签: javascript

我有ObjectA和objectB。

当ObjectB完成任务时,我想在ObjectA中控制。

所以我有():

ObjectB = function () 
  {
    this.loaded;  // it will be a fun 
    load_end = function () { this.loaded();} 
  } 

我也有:

ObjectA.set_load_fun = function (ext_fun) { ext_fun = ObjectA.fake_fun;} 

,代码为:

ObjectA.set_load_fun (ObjectB.loaded);
ObjectB.load();
.....
// when ObjectB has finished calls load_end, and then calls this.loaded
// but this.loaded is really 'ObjectA.fake_fun'
// 

我不想写一个事件监听器.... (或者我想写'内置'事件?) 我想和ajax,filereader等一样做。

 xhr.onload     = function(evt) {  };
 xhr.onprogress = function (evt) {};

(在这种情况下,我没有定义addeventlistener(xhr," onload");}

我只是想写

 ObjectB.loaded = ObjectA.fake_fun 
 ObjectB.loaded = global_object.function;
 ObjectB.loaded = mynamespaced.bla.bla.bla.function;

我希望我解释得很好......

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

如果我理解你的问题,几乎一切看起来都不错。您只需要将加载的函数分配给objectB,因此您需要将objectB传递给set_load_fun方法或只需指定此函数。

e.g。 1:

ObjectA.set_load_fun = function (obj) { obj.loaded = ObjectA.fake_fun;} ;
ObjectA.set_load_fun (ObjectB);
ObjectB.load();

e.g。 2:

ObjectB.loaded = ObjectA.fake_fun;
ObjectB.load();

此外,如果你需要使用'这个'用于在加载的函数中处理ObjectA的关键字,您需要使用绑定函数。

我为你创建了JsFiddle example。 希望它会有所帮助。

答案 1 :(得分:0)

您需要包装该函数,使其包含要在其中评估函数的上下文的对象。

var A =  {
    prop: "i am in A",
    loaded: function ()  {
        console.log(this.prop); 
    }
}

var B =  {
    call_func: function (fn) {
       fn(); 
    }
}

B.call_func(A.loaded); // in console you will see undefined instead of "i am in A",
//because the function will be evaluated in context of window object

您需要包装已加载的函数,以便在A。

的上下文中进行评估
B.call_func(function () {
     A.loaded(); 
}); // now you will see in console "i am in A"

正如您所看到的,如果需要在ObjectB.loaded = ObjectA.fake_fun;的上下文中评估fake_fun,则在您的代码中您无法使用ObjectA。您需要将其更改为ObjectB.loaded = function () { ObjectA.loaded(); };

答案 2 :(得分:0)

好的,据我所知你想在objectB的加载变量中添加一个回调函数,然后在一段时间之后调用它作为this.loaded();

现在有不止一种方法可以做到这一点,但你想将它用作ObjectB.loaded = fun;

而不是

ObjectA.set_load_fun (ObjectB.loaded);

发送

ObjectA.set_load_fun (ObjectB);

并将其用作:

ObjectA.set_load_fun = function (obj) { obj.loaded = ObjectA.fake_fun;} 

您需要这样做的原因是因为如果完全更改了传递的引用,则原始对象保持不受影响。为了更清晰,请阅读javascript中的值和引用传递。