2010-06-16 79 views
1
var Test = (function() { 
    return { 
     useSub: function() { 
      this.Sub.sayHi(); 
     }, 

     init: function() { 
      $(document).ready(this.useSub); 
     } 
    }; 
})(); 

Test.Sub = (function() { 
    return { 
     sayHi: function() { 
      alert('hi'); 
     } 
    }; 
})(); 

Test.useSub(); // works 
Test.init(); // explodes 

上面我正在嘗試創建一個Test名稱空間並向它添加一個對象Sub。直到我嘗試在jQuery中使用該對象時,我一直做得很好。錯誤是「Uncaught TypeError:無法調用未定義的方法'sayHi'」。如果有更好的方法來做到這一點,我願意接受。如何將對象添加到JavaScript命名空間?

編輯:

顯然這是演示代碼。在我的實際應用中,我有,因爲我認爲這是最明顯的去解決方案是這一個:

var Namespace (function() { 
    return { 
    init: function() { 
     $(document).ready(function() { 
     Namespace.onReady(); 
     } 
    }, 
    onReady: function() { 
     alert('Now I am back in the Namespace scope. Proceed as planned'); 
    } 
    }; 
})(); 

EDIT2:所有的jQuery的回調似乎要求他們以這種方式使用,否則作用域是搞砸了。

回答

5

我認爲這是一個範圍問題。如果你

$(document).ready(this.useSub); 

然後this.useSub將在window範圍內執行(所以裏面的功能,thiswindow對象),不存在一個Sub屬性。

嘗試:

init: function() { 
    var obj = this; 
    $(function(){obj.useSub()}); 
} 

出於某種原因,這是行不通的使用$(document).ready(function(){obj.useSub()});但它與$()快捷方式工作。

+1

取代這個+1我更喜歡'that = this',但是,這是解決方案。 – Skilldrick 2010-06-16 19:35:46

+0

var that = this; $(document).ready(function(){that.useSub();}); 適合我。 – Skilldrick 2010-06-16 19:38:25

+0

@Skilldrick:我用JS Bin對它進行了測試,它在那裏不起作用,但是它可能與它們的設置有關。 – 2010-06-16 19:39:16

2

這裏有一種方法

var Test = { 
    useSub : function() { 
    Test.Sub.sayHi(); 
    }, 
    init: function() { 
    $(document).ready(Test.useSub); 
    }, 
    Sub: { 
    sayHi: function() { 
     alert('hi'); 
    } 
    } 
}; 
+0

這不起作用。它有同樣的問題。 – 2010-06-16 19:35:18

+0

@fletcher摩爾....對不起,我忘了用測試 – 2010-06-16 19:39:20

1
在這一行

$(document).ready(this.useSub); 

你傳遞一個參考的功能和範圍遺失─功能運行時,this不再意味着Test