指某东西的用途:
var MyClass = (function (window, document, Math, undefined) {
...
})(window, document, Math, undefined);
被误导了。如果意图是“安全”地访问本机方法,那么如果在代码运行之前已经为这些标识符分配了新值,那么它将失败。
你能做的最好的事情是:
var myClass = function(global) {
// In here you can be certain that global references the global (window) object
var window = global;
// and that the value of undefined will be undefined
var undefined;
// But you are still uncertain of
var document = window.document;
var Math = window.Math;
...
// guaranteed access to the global object
}(this));
this的值不能在任何上下文中被覆盖(尽管它可以在通过调用或绑定进入函数时设置),因此在全局执行上下文中它必须引用原始全局对象。但是Math和window属性可能已经被重新分配,你不能阻止它(尽管 ECMAScript 的未来版本可能在某些情况下使它变得不可能)。
因此,如果 IIFE 必须在重新分配感兴趣的属性之前运行,那么创建别名就没有任何价值。尽管正如其他人所说,它可能有助于缩小。
请注意,创建宿主对象和方法的别名是有问题的,例如
var getEl = document.getElementById;
var el = getEl('foo');
很可能会抛出错误,因为getElementById函数可能期望作为文档方法被调用,因此它的this可能设置不正确。