据此:
(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
。而且,如果MyClass1
0想分配给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"