根据这个:

(function(window) {
    window.MyClass1 = function(val) {
        this.val = val;
        console.log(this.val);
    };
}(window));

(function() {
    window.MyClass2 = function(val) {
        this.val = val;
        console.log(this.val);
    };
}());

(function() {
    this.MyClass3 = function(val) {
        this.val = val;
        console.log(this.val);
    };
}());

(function() {
    MyClass4 = function(val) {
        this.val = val;
        console.log(this.val);
    };
}());

new MyClass1('works1');
new MyClass2('works2');
new MyClass3('works3');
new MyClass4('works4');

jsFiddle

MyClass1,MyClass2,MyClass3和MyClass4有什么区别?它们不是都以完全相同的方式连接到窗口对象吗?
什么是最佳做法,为什么?

最佳答案


MyClass1MyClass2之间没有有意义的区别。
MyClass3在严格模式下不起作用,因为IIFE中的this将是undefined,不等于window
MyClass4在严格模式下不起作用,因为严格模式不允许诸如MyClass4的隐式全局变量(分配给未声明的变量)。

在非严格模式下,所有四个都将起作用。在我看来,隐式全局变量只是邪恶的(太容易发生事故),因此即使在非严格模式下也应排除MyClass4。而且,如果MyClass3想要分配给window,似乎也可以只引用window.MyClass3(就像MyClass2一样),而不是通过this这样做,这只会使代码不那么明显并且与严格模式不兼容。



最佳实践是一种在严格和非严格模式下都可以工作并且尽可能简单地实现目标的实现。由于IIFE不会添加任何正在使用的功能,因此我不明白为什么在这种情况下需要使用它。简单性在某种程度上受舆论支配,但我只说这是必要的:

function MyClass1(val) {
    this.val = val;
    console.log(this.val);
};

var x = new MyClass1("foo");
console.log(x.val);            // "foo"

07-24 20:43