JS全局变量类型之间的差异



据此:

(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之间有什么区别?它们不是都以完全相同的方式附着在窗口对象上吗?最佳做法是什么?为什么?

MyClass1、MyClass2、MyClass3和MyClass4?它们不是都连接到中的窗口对象吗完全相同的方式?

CCD_ 1和CCD_。

MyClass3将不会在严格模式下工作,因为IIFE内的this将是undefined,而不等于window

MyClass4将无法在严格模式下工作,因为严格模式不允许隐式全局变量(未声明而分配给的变量),如MyClass4

在非严格模式下,所有四个都将工作。在我看来,隐式全局变量只是邪恶的(太容易发生事故),所以即使在非严格模式下也应该排除MyClass4。而且,如果MyClass10想分配给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"

相关内容

  • 没有找到相关文章

最新更新