2010-05-04 192 views
4

有沒有辦法在超出範圍時更改變量?我知道一般情況下,你不能,但我想知道是否有任何技巧或覆蓋。例如,是否有任何的方式來進行以下工作:更改變量超出範圍?

function blah(){ 
var a = 1 
} 
a = 2; 
alert(blah()); 

EDIT(澄清):

的假設的情況將被修改以setInterval函數中使用的變量,它也是出於範圍和一個不可編輯的以前的JavaScript文件。這是一個非常古怪的場景,但這是我打算詢問的。

回答

3

沒有竅門或覆蓋。您必須計劃讓這兩個地方都能夠在相同範圍內看到變量。

我能想到關於範圍的唯一技巧是在瀏覽器中使用window來獲取全局對象。這可以幫助你得到一個「隱藏的」變量 - 一個在範圍內,但其名稱已被局部變量(或範圍鏈中更接近的其他變量)超越的變量。

閉包和類可以給你提供一些其他範圍的技巧,但沒有一個允許你完全覆蓋範圍規則。

+0

感謝您的想法。如果其他人知道任何技巧,我會讓問題坐下來一會兒。否則,這是正確的答案。謝謝。 – Matrym 2010-05-04 03:10:00

2

我不明白爲什麼你需要這樣做,如果你需要一個可以從外部訪問的變量,只需在外部聲明它。

現在,如果你問這是因爲你想學習一些東西,對你有好處。

var a = 0; 

function blah() { 
    a = 1; 
    return a; 
} 
a = 2; 

alert(blah()); 
+2

點因爲是的,我用一個古怪的場景瞎掰,你似乎已經意識到了) – Matrym 2010-05-04 03:02:20

0

函數可以訪問自己的範圍之內聲明的變量,如果它們的功能本身之前宣稱:

var a = 0; 
function blah() { 
    a = 1; 
} 
a = 2; 
alert(blah()); 

請注意,您的var a在函數內部使用聲明的局部變量命名爲;在這裏,我們省略了關鍵字,否則它會隱藏a在外部範圍中聲明!

+0

糟糕,我錯過了'return'關鍵字。 – 2010-05-04 02:54:17

+0

它們不需要在函數定義之前聲明。 – 2010-05-04 02:57:53

0

不,永遠不會工作,但你可以使用一個全球性的:

var a; 
function blah(){ 
a = 1 
} 
a = 2; 
alert(blah()); 

或使用閉包:

function bleh() { 
    var a; 
    function blah(){ 
    a = 1 
    } 
    a = 2; 
    alert(blah()); 
} 

,或者你可以用一回各地傳遞(其表現不同,但可能是你想要做的):

function blah(a){ 
a = 1 
return a; 
} 
a = 2; 
alert(blah(a)); 
+0

你忘了返回 – Thielicious 2017-03-29 08:37:47

1

您可以從函數返回值,當然:

function blah() { 
    var a=1; 
    return a; 
} 

但我認爲這不是你腦子裏想什麼相當。由於函數調用通過局部變量創建閉包,一旦創建閉包,通常不可能修改這些值。

對象有些不同,因爲它們是參考值。

function blah1(v) { 
    setInterval(function() { 
     console.log("blah1 "+v); 
    }, 500); 
} 
function blah2(v) { 
    setInterval(function() { 
     console.log("blah2 "+v.a); 
    }, 500); 
} 

var a = 1; 
var b = {a: 1}; 
blah1(a); 
blah2(b); 
setInterval(function() { 
    a++; 
}, 2000); 
setInterval(function() { 
    b.a++; 
}, 2000); 

如果您在使用控制檯對象的環境中運行這個,你會看到報道blah2變化2秒後,但blah1只是繼續使用相同的值v的值。