2011-09-17 55 views
0

可以将子范围内的私有变量设置为其父范围中的同名私有变量的值吗?将私有变量赋值给其父范围中的同名变量的值

考虑以下几点:

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. 

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

+0

我很好奇你为什么要这样的解决方案 - 有什么具体的你想要做的? –

回答

1

在第二种情况下,全局变量不可见,因为有一个局部变量具有相同的名称。换句话说,局部变量隐藏全局变量。

var foo = foo; 

foo的声明仅到达;之后结束。但试图初始化foofoo本身是未定义的,因为它尚未达到声明的终点。

0

是的,但您必须明确引用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' 
    })(); 
})(); 
+1

它可能在这种情况下工作,但一般来说,当以这种方式调用函数时,this指的是全局对象,而不是“父范围”。 –

+0

或者在“this”被绑定的事件处理程序中,不是? –

+1

@Felix - 好点。在这一点上进行修正更新。无论哪种方式,这可能是一个愚蠢的做法 - 我只是试图证明,在某些情况下,你可以得到这种行为与临时变量。 – jmar777