我猜想使用这种模式是新的热点,但是我不了解优点是什么,也不了解范围界定的含义。
模式:
(function(window, document, undefined){ window.MyObject = { methodA: function() { ... }, methodB: function() { ... } }; })(window, document)
所以我对此有几个问题。
封装这样的对象有特别的优势吗? 为什么要输入 窗口 和 文档 而不是正常访问? 到底为什么undefined要传入? 将我们正在创建的对象直接附加到窗口是否是一个特别好的主意?
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. }();
这些模式中的一种在功能上是否优于另一种?第一个是另一个的演变吗?
为什么要输入窗口和文档而不是正常访问?
通常,为了加快标识符解析过程的速度,将它们用作局部变量可能会有所帮助(尽管IMO的性能改进可能微不足道)。
在非浏览器环境中,传递全局对象也是一种广泛使用的技术,在该环境中,您window在全局范围内没有标识符,例如:
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。
window.undefined
这个名字undefined在JavaScript并不代表什么特别的,是不是像一个关键字true,false等等…,它只是一个标识符。
true
false
仅作记录,在ECMAScript 5中,此属性被设为不可写…
将我们正在创建的对象直接附加到窗口是否是一个特别好的主意?
当您在另一个函数范围内时,这是一种用于声明全局属性的常用方法。