JS全局变量类型之间的区别

时间:2015-12-27 08:37:04

标签: javascript oop global-variables

根据这个:

(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');

on jsFiddle

MyClass1,MyClass2,MyClass3和MyClass4有什么区别?是不是所有这些都以完全相同的方式附加到窗口对象? 什么是最佳做法以及为什么?

1 个答案:

答案 0 :(得分:1)

  

MyClass1,MyClass2,MyClass3和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"