函式無法正常使用外部迴圈的變數值

2021-09-29 00:18:26 字數 1497 閱讀 4178

當我們在for迴圈中用了乙個settimeout函式,會發現每次函式在用外部迴圈的變數會有問題,js**如下:

var arr=[1

,2,3

]for

(var i =

0; i }<

/script>

出現這個問題是因為for迴圈是乙個同步任務,而settimeout為乙個非同步函式,在**執行時,for迴圈會先執行直到條件不滿足,然後才執行settimeout裡面的 非同步任務。我們將**整理一下,其實它是這樣的:

var arr=[1

,2,3

];var i;i=0

;i=1;

i=2;i=

3;settimeout

(function()

)settimeout

(function()

)settimeout

(function()

)<

/script>

當for迴圈結束時變數i的值為3,最後控制台輸出了3次arr[3],即輸出3次undefind,解決辦法:

var arr =[1

,2,3

]for

(var i =

0; i < arr.length; i++))

}(i))}

<

/script>

var arr=[1

,2,3

];var i;i=0

;i=1;

i=2;i=

3;(function

(i))

}(i))(

function

(i))

}(i))(

function

(i))

}(i)

)<

/script>

var arr =[1

,2,3

];for(

let i =

0; i < arr.length; i++))

}<

/script>

輸出結果與自呼叫函式一樣;因為我們定義變數時將var換成let就限定了變數的作用域,**執行過程與自呼叫函式類似,也是最簡便的方法。

var arr =[1

,2,3

];for(

let i =

0; i < arr.length; i++))

}<

/script>

此時控制台輸出同樣為1,2,3

其實出現這個問題的關鍵在於使用var定義變數會有乙個變數提公升的過程,使之成為了全域性變數,我們就想辦法限定變數的作用域,把它變成乙個區域性變數來使用。

bash的迴圈中無法儲存變數

在bash中,如果迴圈在乙個子shell中執行,那麼在迴圈中對迴圈外面的變數的更改將在迴圈退出後不可見。像下面的例子 bin sh var 1 python run.py while read line doecho line var var 1 let var var 1 done echo va...

在函式內部訪問外部的變數

變數是有作用域的.函式不僅可以定義在模組的最外層,還可以定義在另外乙個函式的內部,像這種定義在函式裡面的函式稱之為巢狀函式 例如 def print msg print msg 是外圍函式 msg zen of python def printer printer是巢狀函式 print msg pr...

Python2 7自帶的pip無法正常使用

在電腦中同時安裝多個版本的python時,往往需要配套的pip才能方便使用。python2.7自帶的pip是9.0版本,在安裝包時往往報錯,而且提示更新,但是按照提示更新卻不能成功。此時就需要先解除安裝自帶的pip,然後安裝新版本。具體方法如下 1.解除安裝pip python m pip unin...