當我們在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...