猿问

使用(函数(窗口,文档,未定义){...})(窗口,文档)赋予什么优势?

使用(函数(窗口,文档,未定义){...})(窗口,文档)赋予什么优势?

我想使用这种模式是新的热点,但我不明白它的优点是什么,我不理解范围的含义。

模式:

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

所以我对此有几个问题。

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

我已经习惯了我称之为Crockford风格的Javascript封装(因为我从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.}();

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


慕田峪7331174
浏览 345回答 3
3回答

冉冉说

为什么窗口和文档被输入而不是正常访问?通常,为了加强标识符解析过程,将它们作为局部变量可以提供帮助(尽管IMO的性能改进可以忽略不计)。传递全局对象也是非浏览器环境中广泛使用的技术,您window在全局范围内没有标识符,例如:(function&nbsp;(global)&nbsp;{ &nbsp;&nbsp;//..})(this);&nbsp;//&nbsp;this&nbsp;on&nbsp;the&nbsp;global&nbsp;execution&nbsp;context&nbsp;is&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;global&nbsp;object&nbsp;itself为什么heck未定义被传入?之所以这样做是因为undefinedECMAScript 3中的全局属性是可变的,这意味着某人可以更改其影响代码的值,例如:undefined&nbsp;=&nbsp;true;&nbsp;//&nbsp;mutable(function&nbsp;(undefined)&nbsp;{ &nbsp;&nbsp;alert(typeof&nbsp;undefined);&nbsp;//&nbsp;"undefined",&nbsp;the&nbsp;local&nbsp;identifier})();&nbsp;//&nbsp;<--&nbsp;no&nbsp;value&nbsp;passed,&nbsp;undefined&nbsp;by&nbsp;default如果仔细观察undefined实际上没有被传递(函数调用没有参数),这是获取undefined值的可靠方法之一,而不使用该属性window.undefined。这个名字undefined在JavaScript并不代表什么特别的,是不是关键字一样true,false等...,它只是一个标识符。仅仅为了记录,在ECMAScript 5中,这个属性是不可写的......将我们正在创建的对象直接附加到窗口是一个特别好的主意吗?当您在另一个函数范围内时,这是用于声明全局属性的常用方法。

长风秋雁

我和你一起使用Crockford的风格。回答你的问题1.封装像这样的对象有什么特别的优势吗?我能看到的唯一优势是通过创建窗口和文档局部变量而不是全局变量,你可以通过不能直接覆盖任何一个以及它们都是本地的一些性能增益来获得一些额外的安全性。2.为什么窗口和文件被送入而不是正常访问?以上解决。局部变量往往更快,但随着jit汇编这些天变得名义上。为什么这个未定义被传入?没有线索....4.将我们正在创建的对象直接附加到窗口是一个特别好的主意吗?可能不是,但我仍然坚持使用Crockford的模式,因为将函数附加到窗口对象会通过窗口对象将其暴露给全局堆栈的其余部分,而不是通过非标准命名空间公开它。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答