我正在阅读“Javascript:The Definitive Guide”,6E,我遇到了这个例子:
var cookies = (function() {
var cookies = {};
var all = document.cookie;
if ( all === "" )
return cookies;
var list = all.split("; ");
for ( var i = 0; i < list.length; i++ )
{
var cookie = list[ i ];
var p = cookie.indexOf( "=" );
var name = cookie.substring( 0, p );
var value = cookie.substring( p + 1 );
value = decodeURIComponent( value );
cookies[ name ] = value;
}
return cookies;
}());
我可以看到他在这里做了什么;他创建了一个函数并立即调用它。在这种情况下,我只是不明白为什么他会这样做。我之前在jQuery中看到过这个习惯用来隐藏“$”运算符,但是他并没有在这里隐藏任何东西;他创建的唯一变量是“cookies”,这就是他填充的变量。我无法弄清楚这有什么不同:
var cookies = {};
var all = document.cookie;
if ( all !== "" )
{
var list = all.split("; ");
for ( var i = 0; i < list.length; i++ )
{
var cookie = list[ i ];
var p = cookie.indexOf( "=" );
var name = cookie.substring( 0, p );
var value = cookie.substring( p + 1 );
value = decodeURIComponent( value );
cookies[ name ] = value;
}
}
除了在全球范围内引入“所有”之外?是否有一些更深层次的案例,他正在回避这个我不知道的特殊例子?
答案 0 :(得分:2)
Javascript只有两个范围:Global和Function。与许多语言不同,它没有块范围。
因此,您的替代代码会放置all
,list
,i
,cookie
,p
,name
和{{1}进入任何范围value
正在定义。
现在,如果你的代码片段在某个函数定义中并且正在返回cookie,那可能不是那么糟糕。但如果它位于顶级脚本中,那么您正在查看许多非常常见的变量名称,这些变量名称将转储到全局名称空间中。
因此,当您需要函数的作用域限制时,立即函数很有用,但实际上并不希望事后有一个Function对象。
扩展其他优势。
即时功能的另一个常见用途是按时进行设置,通常是在涉及浏览器嗅探时:
cookies
在一次拍摄中,您已经定义了与浏览器兼容的var foo = (function(browser) {
if(isBar(browser) {
return function() {
/* Some implementation of foo that is compatible with bar */
};
} else if(isBaz(browser) {
return function() {
/* Some implementation of foo that is compatible with baz */
};
} else {
return function() {
/* Some generic implementation of foo */
};
}
}(browser_reference));
版本,而不会使用确定浏览器所需的变量来混淆您的范围。
答案 1 :(得分:0)
Javascript没有命名空间的概念。但它确实有范围的概念。示例代码是一种封装代码和模拟命名空间的方法。
基本上,它会使您的代码不会意外地覆盖其他人的代码(反之亦然)。