为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪7331174 2019-08-26 15:28:33
使用(函数(窗口,文档,未定义){...})(窗口,文档)赋予什么优势?我想使用这种模式是新的热点,但我不明白它的优点是什么,我不理解范围的含义。模式:(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.}();其中一种模式在功能上优于另一种吗?第一个是另一个的演变吗?
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

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

通常,为了加强标识符解析过程,将它们作为局部变量可以提供帮助(尽管IMO的性能改进可以忽略不计)。

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

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

为什么heck未定义被传入?

之所以这样做是因为undefinedECMAScript 3中的全局属性是可变的,这意味着某人可以更改其影响代码的值,例如:

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

如果仔细观察undefined实际上没有被传递(函数调用没有参数),这是获取undefined值的可靠方法之一,而不使用该属性window.undefined

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

仅仅为了记录,在ECMAScript 5中,这个属性是不可写的......

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

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


查看完整回答
反对 回复 2019-08-26
?
长风秋雁

TA贡献1757条经验 获得超7个赞

我和你一起使用Crockford的风格。

回答你的问题

1.封装像这样的对象有什么特别的优势吗?

我能看到的唯一优势是通过创建窗口和文档局部变量而不是全局变量,你可以通过不能直接覆盖任何一个以及它们都是本地的一些性能增益来获得一些额外的安全性。

2.为什么窗口和文件被送入而不是正常访问?

以上解决。局部变量往往更快,但随着jit汇编这些天变得名义上。

为什么这个未定义被传入?

没有线索....

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

可能不是,但我仍然坚持使用Crockford的模式,因为将函数附加到窗口对象会通过窗口对象将其暴露给全局堆栈的其余部分,而不是通过非标准命名空间公开它。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 344 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号