javascript - 回調(diào)函數(shù)如何訪問(wèn)當(dāng)前函數(shù)作用下的值
問(wèn)題描述
我在函數(shù)中定義了一個(gè)數(shù)組變量,里面存有6個(gè)元素,然后在該函數(shù)中調(diào)用回調(diào)函數(shù),在回調(diào)函數(shù)中無(wú)法訪問(wèn)數(shù)組變量的值,但是可以訪問(wèn)length屬性。感覺(jué)很迷惑,不知道該怎么解決。
for(var i=0;i<bookARR.length;i++){//在該書(shū)中寫(xiě)入 有借圖書(shū)館id//因?yàn)閳D書(shū)館表需要所有書(shū)籍的_id,所以檢測(cè)有時(shí),記錄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()是我在其他模塊定義的函數(shù)
問(wèn)題解答
回答1:因?yàn)?p>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:前面已經(jīng)說(shuō)了原因了,其實(shí)就是在你定義Book.getBookByISBN()這個(gè)函數(shù)里面的回調(diào)調(diào)用的地方傳入bookArr[i]就好了,理解一下形參和實(shí)參
回答4:這是個(gè)典型的異步問(wèn)題,i的作用域還在其中。因?yàn)楫惒降饶?getBookByISBN 方法調(diào)用callback的時(shí)候 i=bookARR.length。這已經(jīng)越界了,所以是undefined.
解決方:1.閉包2.let
相關(guān)文章:
1. css - 對(duì)于類(lèi)選擇器使用的問(wèn)題2. javascript - 奇怪的Symbol的問(wèn)題3. python - 為什么在main()函數(shù)里result 會(huì)變成那樣?4. javascript - Web微信聊天輸入框解決方案5. angular.js - angular ng-class里面的引號(hào)問(wèn)題6. docker - 如何修改運(yùn)行中容器的配置7. 網(wǎng)頁(yè)爬蟲(chóng) - 用Python3的requests庫(kù)模擬登陸B(tài)ilibili總是提示驗(yàn)證碼錯(cuò)誤怎么辦?8. javascript - es6將類(lèi)數(shù)組轉(zhuǎn)化成數(shù)組的問(wèn)題9. javascript - 有沒(méi)有什么好的圖片懶加載的插件,需要包含監(jiān)聽(tīng)頁(yè)面滾動(dòng)高度,然后再加載的功能10. html - vue項(xiàng)目中用到了elementUI問(wèn)題
