IE中Javascript名称空间抛出错误

IE中Javascript名称空间抛出错误,javascript,Javascript,在我的项目中,我为每个网页创建模块,并将其添加到名为视图的基本对象中: App.js var View = (function() { var View = function() { this.attributes = { baseUrl : '', urls : {} }; }; View.prototype.setUrl = function(url) { t

在我的项目中,我为每个网页创建模块,并将其添加到名为
视图
的基本对象中:

App.js

var View = (function()  {

    var View  = function()  {
        this.attributes = {
            baseUrl : '',
            urls : {}
        };
    };

    View.prototype.setUrl = function(url)   {
        this.attributes.baseUrl = url;
    };

    View.prototype.getUrl = function()  {
        return this.attributes.baseUrl;
    };

    return new View();

})();
var View = View || {};

var SearchView = View.SearchView = (function()  {

    var Private = {
        search : function(url)  {},
        loadSearchResult : function()   {},
        clearSearchForm : function()    {}
    };

    Private.search = function(url)  {
        ajax(url,...);
        this.loadSearchResult();
    };

    var SearchView = function() {
        this.settings = {};
    };

    SearchView.prototype.loadEventBindind = function()  {
        $(document)

        .on('click','#search-button', function()    {
            Private.search(View.baseUrl);
        })

        .on('click','#reset-search', function() {
            Private.clearSearchForm();
        });
    };

    return new SearchView();

})();
SearchView.js

var View = (function()  {

    var View  = function()  {
        this.attributes = {
            baseUrl : '',
            urls : {}
        };
    };

    View.prototype.setUrl = function(url)   {
        this.attributes.baseUrl = url;
    };

    View.prototype.getUrl = function()  {
        return this.attributes.baseUrl;
    };

    return new View();

})();
var View = View || {};

var SearchView = View.SearchView = (function()  {

    var Private = {
        search : function(url)  {},
        loadSearchResult : function()   {},
        clearSearchForm : function()    {}
    };

    Private.search = function(url)  {
        ajax(url,...);
        this.loadSearchResult();
    };

    var SearchView = function() {
        this.settings = {};
    };

    SearchView.prototype.loadEventBindind = function()  {
        $(document)

        .on('click','#search-button', function()    {
            Private.search(View.baseUrl);
        })

        .on('click','#reset-search', function() {
            Private.clearSearchForm();
        });
    };

    return new SearchView();

})();
search.html

<script type="text/javascript" src="media/scripts/Modules/App.js"></script>
<script type="text/javascript" src="media/scripts/View/SearchView.js"></script>
<script type="text/javascript">
    View.setUrl('http://www.set.com/');
    View.SearchView.loadEventBindings();
</script>

View.setUrl('http://www.set.com/');
View.SearchView.loadEventBindings();
此代码在Chrome和Firefox中正常工作,但在IE中引发错误:

View.SearchView
”为
null
或不是对象


IE不支持这种创建对象的方式吗?

您应该做几件事:

您的App.js脚本有一个弱点,它可能会覆盖SearchView.js创建的
View
对象

  • 不要将一个变量同时用作名称空间和类。这是违反直觉的
  • 如果您已经在编写单例,则不需要使用原型模式,尽管它没有什么问题。但是你不会保存任何内存

如果您坚持使用视图作为类和名称空间,请进行如下更改以防止
View
被覆盖

var View = View || {};
var ViewTmp;
$.extend(ViewTmp = (function()  {

    var View  = function()  {
    ...
  ...
})(), View);
View = ViewTmp;

此脚本假定您使用的是jQuery(因为
$.extend
方法)。

@Martin我没有使用backbone.js抱歉,我把其他帖子弄混了。关于这个错误,我在IE中使用双重赋值时遇到了很多错误。您是否尝试过更改:var SearchView=View.SearchView=(function()…for this View.SearchView=(function()){……;var SearchView=View.SearchView;?没问题,martin..我将此约定用于与网页相关的模块..与search.html-SearchView、home.html-HomeView等类似,我删除了var View=View |{;SearchView.js中的行是否有效。为什么需要删除该行?它可能有效,但您遇到的问题与以前相同。一个脚本可能会覆盖另一个脚本设置的
View
。很抱歉回复得太晚。让我检查一下您建议的代码。