2011-11-27 79 views
4

请原谅伪代码,我的实际文件要大得多:/在javascript类里面设置一个回调函数

我想从一个类中调用一个函数(带参数)。但是,该函数应该作为变量传递给类。

someObject = { 
    itWorked:function(answer){ 
     alert(answer); 
    }, 

    plugins:{ 
     somePlugin:function(){ 

      var callback; 
      this.doSomething = doSomething; 

      function setCallback(c){ 
       callback = c; 
      } 

      function doSomething(){ 
       var answer = "hello"; 
       [callback](answer); // how do I call this? 
      } 

     } 
    }, 

    widgets:{ 
     something:function(){ 
      var doIt = new someObject(); 
      doIt.setCallback(someObject.itWorked()); // how do I send this? 
      doIt.doSomething(); 
     } 
    } 
} 

那么我将如何传递itWorked()的类? 如何在类中调用itWorked(answer)函数以及如何将变量传递给if?

回答

1

删除括号将函数作为变量传递。

doIt.setCallback(someObject.itWorked); 

然后,您可以像使用任何其他功能一样使用回调。

callback(answer); 
+0

很好的回答,我只是发布了一个替代实现,但并没有什么错与这一个。 – Zoidberg

+1

你还应该检查回调是否存在,并且是一个可执行的函数:'if(callback && typeof(callback)===“function”){}' –

2

您需要更改

setCallback = function (c) {callback = c;} 

this.setCallback = function (c) {callback = c;} 

所以setCallback功能将被公开。

如果您还想范围回调,你可以这样调用

callback.call(scope, param1, param2); 

如果你不知道有多少参数,你可以这样调用

callback.apply(scope, parameters); 

范围可以是任何对象,即使是空的也可以{}。

顺便说一句,我真的很喜欢你在这个例子中使用私有变量,与JavaScript的伟大工作。这里是写你的JavaScript对象,以帮助初始化和可读性

var mynamespace = {}; 

(function() { 
    function MyObject(param1, param2) { 
     this.initialize(param1, param2); 
    } 

    MyObject.prototype = { 
     initialize: function (param1, param2) { 
      var privateScope = { 
       param1: param1, 
       param2: param2, 
       callback: null 
      }; 

      this.setCallback = function (c) { 
       privateScope.callback = c; 
      } 

      this.doSomething = function() { 
       if (privateScope.callback) { 
        privateScope.callback.call(); 
       } 
      } 
     } 
    } 
    mynamespace.MyObject = MyObject; 
}()); 

然后使用它的好办法

var obj = new mynamespace.MyObject("value1", "value2"); 
这里
+0

谢谢:)我在这里有点js noob级别,感谢您的反馈! – ed209

+0

嗯,你的出发点很好,这是写得很好的javascript。 – Zoidberg

+0

你知道吗,如果有一个__construct()等效于JavaScript?因此,不要调用'''doIt.setCallback(someObject.itWorked)'''在新的someObject()''阶段传入它? – ed209