2012-01-25 30 views
0
對象

我有以下的(簡化的)代碼:init函數和在Javascript

var Foo = (function() { 
    var data = {}, 
     settings = { 
      // default settings here 
     }; 

    function bar(callback) { // bar is an asynchronous function 
     var result = null; 
     // fiddle around until you get a result 
     if (callback) { 
      callback(result); 
     } 
    } 

    return { 
     init: function (options, callback) { 
      var kallback = callback; 
      $.extend(settings, options); 
      bar(function() { 
       if (kallback) { 
        kallback(WHAT_GOES_HERE); 
       } 
      }); 
     }, 
     debug: function() { 
      return { 
       settings: settings, 
       data: data 
      }; 
     }, 
     set: function (k, v) { 
      settings[k] = v; 
     }, 
     get: function (k) { 
      return settings[k]; 
     } 
    }; 
}()); 

上面的代碼是在JS文件,然後在頁所討論的頁腳:

<script type="text/javascript"> 
    Foo.init({ option1: "value", option2: "value" }, function (obj) { 
     console.log("The object was ", obj); 
    }); 
</script> 

基本上,這裏是我希望能夠做到:

  1. 創建一個對象(與一組可選則params的,但這個問題並不重要)
  2. 在對象的創建階段,有它調用異步函數
  3. 當異步函數完成後,我應該能夠觸發回調,而回調的參數應該是intialized對象

我認爲this將工作於上述WHAT_GOES_HERE,但事實證明,至少當我測試它時,this是DOM窗口對象。

首先,我正確構造這個對象?或者有更好的方法來創建它?

其次,假設我這樣做的權利,我們應該在WHAT_GOES_HERE去,這樣,當console.log("The object was ", foo);運行,爲obj值是創建Foo對象?

回答

2

是的,在一個叫做這種方式的匿名函數中,這個將引用窗口對象。指從你必須參考存儲在另一個變量init方法的這一參考:

var kallback = callback, self = this; 
$.extend(settings, options); 
bar(function() { 
    if (kallback) { 
     kallback(self); 
    } 
}); 

你的構造對象的作品,只要你只想有一個單一的Foo對象的方式。

+0

函數是匿名函數並不重要,只能通過函數的定義來說明這個函數永遠不會被認爲是某種東西。它僅在通話期間解決,僅適用於該通話。 – Esailija

+0

這就是爲什麼我說這樣稱呼_ – Daff

+0

對不起,我錯過了; o只是閱讀「在一個匿名函數」。祝你有個好的一天。 – Esailija