有沒有辦法在超出範圍時更改變量?我知道一般情況下,你不能,但我想知道是否有任何技巧或覆蓋。例如,是否有任何的方式來進行以下工作:更改變量超出範圍?
function blah(){
var a = 1
}
a = 2;
alert(blah());
EDIT(澄清):
的假設的情況將被修改以setInterval函數中使用的變量,它也是出於範圍和一個不可編輯的以前的JavaScript文件。這是一個非常古怪的場景,但這是我打算詢問的。
有沒有辦法在超出範圍時更改變量?我知道一般情況下,你不能,但我想知道是否有任何技巧或覆蓋。例如,是否有任何的方式來進行以下工作:更改變量超出範圍?
function blah(){
var a = 1
}
a = 2;
alert(blah());
EDIT(澄清):
的假設的情況將被修改以setInterval函數中使用的變量,它也是出於範圍和一個不可編輯的以前的JavaScript文件。這是一個非常古怪的場景,但這是我打算詢問的。
沒有竅門或覆蓋。您必須計劃讓這兩個地方都能夠在相同範圍內看到變量。
我能想到關於範圍的唯一技巧是在瀏覽器中使用window
來獲取全局對象。這可以幫助你得到一個「隱藏的」變量 - 一個在範圍內,但其名稱已被局部變量(或範圍鏈中更接近的其他變量)超越的變量。
閉包和類可以給你提供一些其他範圍的技巧,但沒有一個允許你完全覆蓋範圍規則。
我不明白爲什麼你需要這樣做,如果你需要一個可以從外部訪問的變量,只需在外部聲明它。
現在,如果你問這是因爲你想學習一些東西,對你有好處。
var a = 0;
function blah() {
a = 1;
return a;
}
a = 2;
alert(blah());
點因爲是的,我用一個古怪的場景瞎掰,你似乎已經意識到了) – Matrym 2010-05-04 03:02:20
函數可以訪問自己的範圍之內聲明的變量,如果它們的功能本身之前宣稱:
var a = 0;
function blah() {
a = 1;
}
a = 2;
alert(blah());
請注意,您的var a
在函數內部使用聲明的局部變量命名爲;在這裏,我們省略了關鍵字,否則它會隱藏a
在外部範圍中聲明!
糟糕,我錯過了'return'關鍵字。 – 2010-05-04 02:54:17
它們不需要在函數定義之前聲明。 – 2010-05-04 02:57:53
不,永遠不會工作,但你可以使用一個全球性的:
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));
你忘了返回 – Thielicious 2017-03-29 08:37:47
您可以從函數返回值,當然:
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的值。
感謝您的想法。如果其他人知道任何技巧,我會讓問題坐下來一會兒。否則,這是正確的答案。謝謝。 – Matrym 2010-05-04 03:10:00