【问题标题】:Accessing variable in outer scope?在外部范围内访问变量?
【发布时间】:2011-06-01 13:47:35
【问题描述】:
(function () {
    var x = 1;
    return {
        f: function (x) {
            alert(x);
        }
    };
}()).f(2);

假设我不想重命名任何一个变量。没有办法从f 中访问变量x,它首先被声明——对吧?

【问题讨论】:

  • 你可以用方法暴露变量
  • 为什么不想重命名变量?
  • 参数x 遮蔽变量x。就像在许多其他编程语言中一样(有时可以解决,但在这个例子中,没有)。

标签: javascript closures scope


【解决方案1】:

正确。因为您在function (x) 中有不同的x,所以任何访问x 的尝试都会得到那个(最近的范围)。它在更广泛的范围内阻止对任何x 的访问。

【讨论】:

    【解决方案2】:

    这允许您同时使用 x (1) 和 x (2)。

    (function () {
        var x = 1;
        return {
            f: function (x) {
                alert(x); // paramter (=2)
                alert(this.x); // scoped variable (=1)
            },
            x:x
        };
    }()).f(2);
    

    【讨论】:

    • 一个有趣的方法。谢谢!不过,在现实生活中,我不想暴露x
    【解决方案3】:

    你可以用函数返回变量:

    (function () {
        var x = 1;
        return {
            f: function () {
                alert(this.x);
            },
            x:x
        };
    }()).f();
    

    【讨论】:

      【解决方案4】:

      无法从f 中访问变量x,它首先被声明

      不,没有。内部作用域x 隐藏了外部作用域x

      var closure = (function () {
          var local = {};
          local.x = 1;
          return {
              f: function (x) {
                  alert(x || local.x);
              }
          };
      }());
      
      closure.f(2);  // alerts "2"
      closure.f();   // alerts "1"
      

      当然,你不能有一个名为“local”的内部变量。 ;-)

      【讨论】:

        【解决方案5】:

        意识到隐式异步调用会让您认为您无法从外部范围访问变量:

        result = {}
        jQuery.ajax({ // it is a async call!
            url: "/some/url",
            success: function(data) {
                result = JSON.parse(data);
            }
        });
        
        return result; // Result will be still {} because function returns before request has done.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          • 2021-08-18
          • 1970-01-01
          • 1970-01-01
          • 2014-05-29
          • 2023-04-07
          相关资源
          最近更新 更多