5

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

var wrapper = {
    foo: function(){
        return 42;
    },
    bar: this.foo()
};

它失败了,声称“未定义 foo”。在完成对象声明之前调用方法可能很糟糕,所以我移动了 bar,它起作用了。

var wrapper = {
    foo: function(){
        return 42;
    },
};
wrapper.bar = wrapper.foo();

我觉得这可能会变得有点难看,尤其是对于嵌套的命名空间等,那么是否有任何变通方法不会使一次看到所有包装器的成员变得困难?

4

3 回答 3

1

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

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

wrapper.init();

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

于 2013-08-26T04:24:35.290 回答
0
var wrapper = {
foo: (function(){
    return 42;
     })()

};

alert(wrapper.foo);

http://jsfiddle.net/ee8Ww/

于 2013-08-26T05:07:34.907 回答
0

除非 wrapper 是 1) 一个函数,并且 2) 你实例化它以使用它,否则这样使用this将不起作用:

var wrapper = function() {
  this.foo = function() { return 42; }
  this.bar = this.foo();
};

var wrapperInstance = new wrapper();
alert(wrapperInstance.bar()); // 42
wrapperInstance.foo(); // also works
于 2013-08-26T04:26:41.360 回答