一尘不染

使用(function(window,document,undefined){…})(window,document)有什么好处?[重复]

javascript

我猜想使用这种模式是新的热点,但是我不了解优点是什么,也不了解范围界定的含义。

模式:

(function(window, document, undefined){
  window.MyObject = {
    methodA: function() { ... },
    methodB: function() { ... }
  };
})(window, document)

所以我对此有几个问题。

封装这样的对象有特别的优势吗?
为什么要输入 窗口文档 而不是正常访问?
到底为什么undefined要传入?
将我们正在创建的对象直接附加到窗口是否是一个特别好的主意?

我习惯了我所说的Crockford风格的Java封装(因为我从Douglas Crockford Javascript视频中获得了它)。

NameSpace.MyObject = function() {
  // Private methods
  // These methods are available in the closure
  // but are not exposed outside the object we'll be returning.
  var methodA = function() { ... };

  // Public methods
  // We return an object that uses our private functions,
  // but only exposes the interface we want to be available.
  return {

    methodB: function() {
      var a = methodA();
    },
    methodC: function() { ... }

  }
// Note that we're executing the function here.
}();

这些模式中的一种在功能上是否优于另一种?第一个是另一个的演变吗?


阅读 442

收藏
2020-05-01

共1个答案

一尘不染

为什么要输入窗口和文档而不是正常访问?

通常,为了加快标识符解析过程的速度,将它们用作局部变量可能会有所帮助(尽管IMO的性能改进可能微不足道)。

在非浏览器环境中,传递全局对象也是一种广泛使用的技术,在该环境中,您window在全局范围内没有标识符,例如:

(function (global) {
  //..
})(this); // this on the global execution context is 
          // the global object itself

为什么未定义的heck被传入?

这样做是因为undefinedECMAScript 3中的global属性是可变的,这意味着有人可以更改其值来影响您的代码,例如:

undefined = true; // mutable
(function (undefined) {
  alert(typeof undefined); // "undefined", the local identifier
})(); // <-- no value passed, undefined by default

如果您仔细查看undefined实际上没有被传递(函数调用中没有参数),那是undefined不使用property
即可获取值的可靠方法之一window.undefined

这个名字undefined在JavaScript并不代表什么特别的,是不是像一个关键字truefalse等等…,它只是一个标识符。

仅作记录,在ECMAScript 5中,此属性被设为不可写…

将我们正在创建的对象直接附加到窗口是否是一个特别好的主意?

当您在另一个函数范围内时,这是一种用于声明全局属性的常用方法。

2020-05-01