for迴圈內外定義變數的區別

2021-09-23 10:41:42 字數 2592 閱讀 3626

直接上**

var attrouter:object={};

var objouter:object={};

var indexouter:int;

var objinner:object={};

for (var i:int=0; i < 5; i++)

for (var j:int=0; j < 5; j++)

;var indexinner:int=j;

attrinner.name=j.tostring();

attrinner.value=j * 100;

attrinner.index=indexinner;

objinner[j]=attrinner;

}for (var keyouter:int in objouter)

console.log("--------------");

for (var keyinner:int in objinner)

執行出來的結果如下

從執行結果不難發現,對於引用型變數,如果變數申明在for迴圈外層,那麼for迴圈內多次對變數進行賦值時,相同的屬性,後面的賦值會覆蓋前面的賦值。如果變數申明在for迴圈內層,for迴圈內多次對變數進行賦值時,相同的屬性,後面的賦值不會覆蓋前面的賦值。從計算機記憶體來分析,每次申明變數,就會為變數開闢乙個記憶體空間(基本型別儲存在棧中開闢記憶體空間,用完即出棧,引用型別在堆中開闢記憶體空間),對於在for迴圈外層申明的變數,for迴圈內多次對變數進行賦值時,操作的是同一處記憶體空間,同乙個變數。對於在for迴圈內層申明的變數,for迴圈內每次在對變數進行賦值時,都會為變數開闢新的記憶體空間,即使這些變數在呼叫時的變數名一樣,但是for迴圈每迴圈一次,之前申明的變數就已經出棧了(js沒有塊級作用域,所以直到變數所在所在方法執行完畢之後,區域性變數才會出棧),所以其實不存在說多個變數名相同的變數儲存在記憶體中不同區域,變數名實際上用完即出棧。

以上分析的是引用型變數,但是index變數為基本型別變數,在此測試中,仍然符合引用型變數的規則,for迴圈外部申明時,後面的賦值覆蓋前面的賦值,for迴圈內部申明index變數時,後面的賦值不會覆蓋之前的賦值。原因是基本型別也分成員變數和區域性變數,區域性變數隨著方法入棧就存在棧中,而成員變數會隨著物件在堆中空間的開闢而儲存在堆中。

下面再測試純粹基本型別在for迴圈內外定義的區別

for迴圈內部定義基本變數型別,每次執行for迴圈都重新申明變數,不覆蓋之前的值,對於for迴圈外部定義的基本型別變數,**如下

var indexouter:int=-1;

var recordindexouter:int=indexouter;

for (var i:int=0; i < 5; i++)

執行結果如下

輸出了5次-1,說明基本變數型別在for迴圈外部被賦值為基本變數型別indexouter的值後,指向了記憶體值為indexouter當前指向的記憶體空間的值,當給indexouter重新賦值時,相當於修改indexouter的指標,但是基本型別變數recordindexouter的指標並未被修改。

這裡還乙個有意思的現象,如果方法記憶體存在多個{}

if (true)

//變數a是在{}內部申明和賦值的,但是這裡能拿到a初始化之後的值

console.log("a=" + a);

if (true)

內沒有對變數a進行申明,但是可以直接對變數a進行賦值,不會報錯

console.log("a=" + a);

a=2;

console.log("a=" + a);

}

執行結果

這與預期不一致,預期的第二行和第三行應該列印未定義。這是因為js用var定義的變數沒有塊級作用域(es6推出的let也是用來生命變數的,但是let申明的變數存在塊級作用域)。在第一次對變數a進行初始化賦值為1之後,在對a重新賦值之前,整個方法內部都可以訪問到a的值為1。

下面對js塊級作用域進行測試

//這時候只進行了js的變數申明提公升,還沒有對a進行初始化賦值,所以列印未定義

console.log("a=" + a);

if (true)

//變數a是在{}內部申明和賦值的,但是這裡能拿到a初始化之後的值

console.log("a=" + a);

if (true)

內沒有對變數a進行申明,但是可以直接對變數a進行賦值,不會報錯

console.log("a=" + a);

a=2;

console.log("a=" + a);

}

可以發現,在對變數a進行申明之前,就對a初始化為1,而沒有報錯,這是因為js存在變數申明提公升

執行結果如下

try catch放在迴圈內外的區別

如下2段 public void test1 catch interruptedexception e public void test2 catch interruptedexception e test1是將try catch放在了迴圈內,test2是將try catch放在了迴圈個。二者的區別...

for 迴圈裡面定義變數

from 不同的作用域內可以使用相同的變數名,優先使用小範圍的作用域。作用域 全域性段 函式段 塊 1.全域性段定義變數a,main函式中再定義a,那麼main中函式中定義的a,看下面例子 2.塊,由花括號 包含的區域。比如if分支體,for,while迴圈體中定義的變數,其作用域是花括號內。例 i...

python迴圈定義變數

在實際問題中,遇到個問題,我需要建立多檔案,名字沒有規律,把出現該名字的行寫入以該名字命名的檔案中 關鍵就在與locals 函式 定義變數格式 locals name f open gongcheng.json r file name js hwl qhgg sq hwl task for name...