2011-12-02 82 views
2

我收到来自Firebug的以下Javascript的page() is not defined错误消息。为什么?page()未定义错误消息

(function() { 
    var page = function() { 
     var min_central_width = 10; 
     function minimumCentralWidth(val) { 
      min_central_width = val; 
     } 
    } 

    $(document).ready(function() { 
     page().minimumCentralWidth(400); 
    }); 

})(); 

我还是Javascript的新手。我怎样才能避免这种情况?

回答

4

问题是page没有返回值,所以page()undefined。你将不得不这样写:

(function() { 
    var page = function() { 
     // create an object to return: 
     var ret = {}; 
     // set its properties: 
     ret.min_central_width = 10; 
     ret.minimumCentralWidth = 
      function (val) { 
       this.min_central_width = val; 
      }; 
     // return it: 
     return ret; 
    }; 

    $(document).ready(function() { 
     page().minimumCentralWidth(400); 
    }); 

})(); 

。 。 。但上面并没有真正做任何事情。它创建一个新对象,并将该对象的min_central_width设置为400。 。 。但它并不使用任何东西的对象,所以上面没有任何有意义的效果。 (这是因为你删除了与该问题无关的代码吗?如果是这样,那么不要紧。:-)

+0

是的,我只是试图用一个简单的代码示例复制问题。 – JVerstry

+0

@JVerstry:O.K.,很酷。 +1这样做。 :-) – ruakh

2

尽管这里有一些很好的答案,但我想补充一点,以提供一些可能的选择取决于你在做什么。

如果你真的想使minimumCentralWidth Page类的属性,你可以这样做:

(function() { 
    var page = function() { 
     var min_central_width = 10; 
     this.minimumCentralWidth = function (val) { 
      min_central_width = val; 
      alert('set to ' + val); 
     } 
    } 

    $(document).ready(function() { 
     var p = new page(); //new up your object 
     p.minimumCentralWidth(400); 
    }); 

})(); 

如果你试图效仿的静态实用类,你可以做这样的事情:

(function() { 
    var page = new function() { //single instance of your page class 
     var min_central_width = 10; 
     this.minimumCentralWidth = function (val) { 
      min_central_width = val; 
      alert('set to ' + val); 
     } 
    } 

    $(document).ready(function() { 
     page.minimumCentralWidth(400); 
    }); 

})(); 

如果您对这些示例的工作方式有任何具体问题,请告诉我们,我会尝试添加更多的细节!

+0

是的,我确实有一个问题。在第一个例子中,var p = new page();像Java中的new一样创建一个新的页面实例?意思是,如果我修改一个实例,其他实例是不会修改的? – JVerstry

+1

是的,这是非常正确的。你在'p'中改变的任何属性都不会影响你已经'新建'的其他实例,因为每个实例都在它自己的闭包中运行。 –