在对象声明完成之前调用成员方法

Nam*_*ere 5 javascript namespaces

前段时间我听说最好将代码包装在一个大对象中作为命名空间,以减少全局命名空间的混乱并促进库的导出,所以我尝试了这个.

var wrapper = {
    foo: function(){
        return 42;
    },
    bar: this.foo()
};
Run Code Online (Sandbox Code Playgroud)

它失败了,声称"foo没有定义".在完成对象声明之前调用方法可能不好,所以我移动了bar,它起作用了.

var wrapper = {
    foo: function(){
        return 42;
    },
};
wrapper.bar = wrapper.foo();
Run Code Online (Sandbox Code Playgroud)

我觉得这可能会变得有点难看,特别是对于嵌套的命名空间等等,那么有没有任何变通办法让人很难同时看到所有包装器的成员?

Jon*_*owe 1

问题是这this将等于全球背景。您需要像这样访问该函数:

var wrapper = {
    foo: function(){
        return 42;
    },
    bar: null,
    init : function() {
       // all initialization code goes here
       wrapper.bar = wrapper.foo();
    }
};

wrapper.init();
Run Code Online (Sandbox Code Playgroud)

此方法非常适合将代码组织成逻辑块,以便您和未来的开发人员可以轻松地在 javascript 中找到您要查找的内容。