根据这个:
(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有什么区别?是不是所有这些都以完全相同的方式附加到窗口对象? 什么是最佳做法以及为什么?
答案 0 :(得分:1)
MyClass1,MyClass2,MyClass3和MyClass3之间有什么区别 MyClass4?并非所有这些都附加到窗口对象中 完全相同的方式?
MyClass1
和MyClass2
之间没有任何有意义的区别。
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"