2011-11-27 49 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