比如:如果在微信小程式中要遍歷輸出 0-9 的數,我們會使用for迴圈 確實結果也是這樣: 但是,如果我在迴圈時同時調用wx的api介面10次,那麼輸出的結果就會不同(這是產生了閉關的效應) eg:每次調用一次wx.showToast()介面,併在成功時輸出迴圈的值。 結果: 可以看到輸出了10次1 ...
比如:如果在微信小程式中要遍歷輸出 0-9 的數,我們會使用for迴圈
for(var i=0;i<10;i++){ console.log(i); }
確實結果也是這樣:
但是,如果我在迴圈時同時調用wx的api介面10次,那麼輸出的結果就會不同(這是產生了閉關的效應)
eg:每次調用一次wx.showToast()介面,併在成功時輸出迴圈的值。
for(var i=0;i<10;i++){ wx.showToast({ title: 'haha', success:function(){ console.log(i); } }) }
結果:
可以看到輸出了10次10,這是因為i自變數的作用域範圍,在這裡它相當於全局變數。
兩種解決辦法:
1.使用臨時函數
for(var i=0;i<10;i++){ (function(j){ wx.showToast({ title: 'haha', success: function () { console.log(j); } }) })(i); }
以上代碼同:
for(var i=0;i<10;i++){ function temp(j){ wx.showToast({ title: 'haha', success: function () { console.log(j); } }) }; temp(i); } },
結果:
2.使用ES6中let的塊作用域(推薦)
for(let i=0;i<10;i++){ wx.showToast({ title: 'haha', success: function () { console.log(i); } }) }
結果同上。
但是如果將let i定義在函數外部,則對於迴圈來說還是相當於全局變數
let i; for(i=0;i<10;i++){ wx.showToast({ title: 'haha', success: function () { console.log(i); } }) }
結果還是: