在javascript类中设置回调函数

时间:2011-11-27 14:38:45

标签: javascript class callback

原谅伪代码,我的实际文件要大得多:/

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

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?

2 个答案:

答案 0 :(得分:3)

您需要更改

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");

答案 1 :(得分:1)

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

doIt.setCallback( someObject.itWorked );

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

callback( answer );