【问题标题】:Assigning a private variable to the value of a same-named variable from its parent scope将私有变量分配给其父范围内的同名变量的值
【发布时间】:2011-11-19 08:22:21
【问题描述】:

子范围内的私有变量是否可以设置为其父范围内的同名私有变量的值?

考虑以下几点:

var foo = 10;

function bar () {
  var f = foo, foo = f;
  return foo;
}

bar() // Returns 10

不使用占位符变量 f 可以做到这一点吗?

var foo = 10;

function bar () {
  var foo = foo;
  return foo;
}

bar() // Want 10 but returns undefined.

我想要一个不向 bar 传递任何参数的解决方案。我意识到除了美观之外,这并不重要。

【问题讨论】:

  • 我很好奇你为什么想要解决这个问题——你有什么具体的尝试吗?

标签: javascript scope variable-assignment


【解决方案1】:

在第二种情况下,全局变量不可见,因为有一个同名的局部变量。也就是说,局部变量隐藏了全局变量。

var foo = foo;

foo 的声明只有在到达; 后才结束。但是尝试将 foo 初始化为 foo 本身是未定义的,因为它还没有达到声明的终点。

【讨论】:

    【解决方案2】:

    是的,但您必须明确引用父作用域之外的foo。通常这只是this,但在您的函数可能已通过applycall 调用的情况下,您必须小心。例如,这应该可以工作:

    var foo = 10;
    
    function bar () {
      var foo = this.foo;
      return foo;
    }
    
    bar(); // 10
    

    编辑:根据@Felix 的评论,我需要进行更正。 this 实际上通常指的是全局作用域,而不是父作用域。例如:

    var x = 'global';
    (function () {
        var x = 'inner';
        (function() {
            var x = this.x;
            console.log(x); // 'global'
        })();
    })();
    

    【讨论】:

    • 在这种情况下可能会起作用,但一般来说,当以这种方式调用函数时,this 指的是全局对象,而不是“父作用域”。
    • 或者在绑定this的事件处理程序中,不是吗?
    • @Felix - 好点。更新了对这一点的更正。不管怎样,这可能是一种愚蠢的做法——我只是想证明,在某些情况下,你可以在没有临时变量的情况下获得这种行为。
    猜你喜欢
    • 2015-12-06
    • 2018-03-08
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多