0

我正在阅读“Javascript:权威指南”,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;
    }
}

除了在全球范围内引入“全部”吗?是否有一些更深层次的角落案例他正在回避这个我只是不知道的特定示例?

4

2 回答 2

2

Javascript 只有两个作用域:全局和函数。与许多语言不同,它没有块范围。

因此,您的替代代码将all, list, i, cookie, p, name, andvalue放入定义的任何范围内cookies

现在,如果您的代码片段在某个函数定义中并且正在返回 cookie,那可能还不错。但是,如果它在顶级脚本中,那么您会看到很多非常常见的变量名称,这些变量名称要转储到全局命名空间中。

因此,当您需要函数的范围限制时,立即函数很有用,但又不想让 Function 对象在之后乱跑。

编辑

扩大其他优势。

立即函数的另一个常见用途是按时进行设置,通常在涉及浏览器嗅探时:

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));

在一个镜头中,您已经定义了一个与浏览器兼容的版本,foo而不会用确定浏览器是什么所需的变量来混淆您的范围。

于 2012-09-04T21:21:25.490 回答
0

Javascript 没有命名空间的概念。但它确实有一个范围的概念。示例代码是一种封装代码和模拟命名空间的方式。

基本上,它可以防止您的代码意外覆盖其他人的代码(反之亦然)。

于 2012-09-04T21:22:35.503 回答