除了数据隐藏之外,在函数调用中包装数据有什么优势?

时间:2012-09-04 21:17:58

标签: javascript

我正在阅读“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;
    }
}

除了在全球范围内引入“所有”之外?是否有一些更深层次的案例,他正在回避这个我不知道的特殊例子?

2 个答案:

答案 0 :(得分:2)

Javascript只有两个范围:Global和Function。与许多语言不同,它没有块范围。

因此,您的替代代码会放置alllisticookiepname和{{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没有命名空间的概念。但它确实有范围的概念。示例代码是一种封装代码和模拟命名空间的方法。

基本上,它会使您的代码不会意外地覆盖其他人的代码(反之亦然)。