window,document,Math,undefined在类实例化中作为参数传递

时间:2013-10-18 01:09:08

标签: javascript class oop

在创建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);

2 个答案:

答案 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的代码都会突然破坏。

Driving it home


除了上述原因,局部变量可以缩小。因此,减少最终通过线路传输的脚本的大小。

答案 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 功能可能希望被称为文档的,因此,其可能并不的方法设置正确。