javascript - 回調函數如何訪問當前函數作用下的值
問題描述
我在函數中定義了一個數組變量,里面存有6個元素,然后在該函數中調用回調函數,在回調函數中無法訪問數組變量的值,但是可以訪問length屬性。感覺很迷惑,不知道該怎么解決。
for(var i=0;i<bookARR.length;i++){//在該書中寫入 有借圖書館id//因為圖書館表需要所有書籍的_id,所以檢測有時,記錄idconsole.log('在外面'+bookARR[i]);//9787539989891 9787533946777 9787569914078 9787513316286 9787218113180 9787535491978 Book.getBookByISBN(bookARR[i],function(err,book){ if(!book||err){console.log('huidiao'+bookARR.length);//6console.log('在里面'+bookARR[i]);//undefined undefined undefined undefined undefined undefinednewBook.push(bookARR[i]); }else{newBook_id.push(book._id); } ep.emit(’examine’);}) }
Book.getBookByISBN()是我在其他模塊定義的函數
問題解答
回答1:因為for (var i = 0; i<10; i++) { setTimeout(function(){console.log(i)});}for (var i = 0; i<10; i++) { (function(i){ setTimeout(function(){console.log(i)}); })(i)}所以
for(var i=0;i<bookARR.length;i++){ (function(i) {Book.getBookByISBN(bookARR[i],function(err,book){ if(!book||err){console.log('huidiao'+bookARR.length)console.log('在里面'+bookARR[i]);newBook.push(bookARR[i]); }else{newBook_id.push(book._id); } ep.emit(’examine’);}) })(i);}回答2:
在callback 中帶上 bookARR[i]
回答3:前面已經說了原因了,其實就是在你定義Book.getBookByISBN()這個函數里面的回調調用的地方傳入bookArr[i]就好了,理解一下形參和實參
回答4:這是個典型的異步問題,i的作用域還在其中。因為異步等你 getBookByISBN 方法調用callback的時候 i=bookARR.length。這已經越界了,所以是undefined.
解決方:1.閉包2.let
相關文章:
1. Python如何播放還存在StringIO中的MP3?2. css3 - 微信前端頁面遇到的transition過渡動畫的bug3. javascript - 請教如何獲取百度貼吧新增的兩個加密參數4. Python爬蟲如何爬取span和span中間的內容并分別存入字典里?5. python - 編碼問題求助6. (python)關于如何做到按win+R再輸入文件文件名就可以運行?7. 網頁爬蟲 - Python 爬蟲中如何處理驗證碼?8. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處9. mysql 一個sql 返回多個總數10. mysql - 如何減少使用或者不用LEFT JOIN查詢?
