在创建js类的过程中,我看到窗口,文档,数学,未定义的在类的开始和结尾处作为参数传递。 它们有用吗,它们意味着什么?
var MyClass = (function (window, document, Math, undefined) {
function MyClass (opts) {
this.init(opts);
}
MyClass.prototype = {
init: function (opts) {
}
return MyClass;
})(window, document, Math, undefined);
答案 0 :(得分:1)
你错过了一个结束大括号。
var MyClass = (function (window, document, Math, undefined) {
function MyClass (opts) {
this.init(opts);
};
MyClass.prototype = {
init: function (opts) {
}
}; /* <-- closing brace here */
return MyClass;
})(window, document, Math);
MyClass函数/类的全局变量,依赖项被传递到由匿名包装函数创建的方法闭包中,以减少外部脚本改变其预期行为的可能性。这是API的设计者采用的技术,以提高其可靠性。可以想象一个MyClass函数的实例会破坏,如果有人执行了以下脚本 - 在定义MyClass函数之后/之前的某个时间:
Math = undefined /* or some other value */;
因此,任何依赖于Math
的代码都会突然破坏。
除了上述原因,局部变量可以缩小。因此,减少最终通过线路传输的脚本的大小。
答案 1 :(得分:0)
使用:
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 的值不能在任何上下文中覆盖(尽管可以在通过调用或使用bind输入函数时设置),因此在全局执行上下文中它必须引用原始的全球对象。但 Math 和 window 属性可能已被重新分配,您无法阻止(虽然ECMAScript的未来版本在某些情况下可能无法实现)。
因此,如果IIFE必须在重新分配感兴趣的属性之前运行,那么创建别名没有任何价值。虽然正如其他人所说,它可能有助于缩小。
请注意,创建主机对象和方法的别名是有问题的,例如
var getEl = document.getElementById;
var el = getEl('foo');
很可能会引发错误作为的getElementById 功能可能希望被称为文档的,因此,其此可能并不的方法设置正确。