0

在创建 js 类的过程中,我看到window、document、Math、undefined在类的开始和结束时作为参数传递。它们有用吗,它们是什么意思?

var MyClass = (function (window, document, Math, undefined) {

  function MyClass (opts) {
    this.init(opts);
  }

  MyClass.prototype = {

    init: function (opts) {

    }

  return MyClass;
})(window, document, Math, undefined);
4

2 回答 2

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于其预期的代码都会突然中断。

开车回家


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

于 2013-10-18T01:32:23.160 回答
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的值不能在任何上下文中被覆盖(尽管它可以在通过调用或绑定进入函数时设置),因此在全局执行上下文中它必须引用原始全局对象。但是Mathwindow属性可能已经被重新分配,你不能阻止它(尽管 ECMAScript 的未来版本可能在某些情况下使它变得不可能)。

因此,如果 IIFE 必须在重新分配感兴趣的属性之前运行,那么创建别名就没有任何价值。尽管正如其他人所说,它可能有助于缩小。

请注意,创建宿主对象和方法的别名是有问题的,例如

var getEl = document.getElementById;
var el = getEl('foo');

很可能会抛出错误,因为getElementById函数可能期望作为文档方法被调用,因此它的this可能设置不正确。

于 2013-10-18T09:50:18.893 回答