2011-09-17 53 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