Javascript范围问题,在匿名函数内

时间:2012-01-07 21:29:25

标签: javascript scope

对不起我对标题不再具体了。

我正在构建一个网站(个人),根据网址中使用的查询字符串向用户显示不同的内容。

e.g。 page=home.html会显示home.html

网站Javascript包含在一个对象中,每个值包含不同的数据,一些伪代码:

(function(){
    var wrapper = {
        init: function(){
            //Runs on document ready
            this.foo();
            this.nav.render();
        },
        foo: function(){
            //Some functionality goes here for the website, e.g. Display something from an API
        },
        nav: {
            //Functionality to handle the navigation, has different properties
            config: {
                //Contains the config for nav, e.g. page names + locations
                dir: '/directory/to/content/',
                pages: {
                    page_name: wrapper.nav.config.dir + 'page_value'
                }
            },
            render: function(){
                 //some code
            },
            routes: function(){
                 //some code}
            }
        }
    };

    $(function(){
        wrapper.init();
    });
})();

我的问题是我试图将dir值添加到每个page值(在定义页面的对象内),期望获得输出(在此directory/to/content/page_value的伪代码案例,但是当我试图访问它时,dir是未定义的,我尝试了以下内容来实现我想要的:

  • wrapper.nav.config.dir +'page_value'

过去30分钟我一直在试图找出我做错了什么,甚至考虑过对每个页面的URL进行硬编码。

想要这样做的原因是我的本地开发服务器和Web主机具有不同的目录结构,所以每次我想开发+发布时我都不想重写URL。至于为什么所有东西都被包裹在一个物体里面,我觉得用这种方式保存会更容易。

希望答案很简单,这只是一个业余错误/缺乏理解。

4 个答案:

答案 0 :(得分:2)

问题在于,您无法引用在该定义中定义的变量。

因此,在wrapper的定义中,您无法引用wrapper。而且,在config的定义中,您也不能引用config等等。

解决此问题的通常设计模式是在数据结构声明中尽可能多地初始化,然后在.init()中自由访问所有数据结构时进行其余操作。

答案 1 :(得分:1)

将前两行更改为:

var wrapper = null;
(function(){
   wrapper = {

否则,包装器是匿名函数的局部变量。

答案 2 :(得分:1)

问题是当你要求它的值时,你仍然忙着定义包装器,这就是为什么它仍然是未定义的。

以下代码也失败了:

var x = {
    y:"1",
    z:x.y
}

答案 3 :(得分:0)

为什么不:

//...
init: function(){
    //Runs on document ready
    this.foo();
    var config = this.nav.config;
    for (var page in config.pages) {
        config.pages[page] = config.dir + config.pages[page];
    }
},
//...