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. linux - 编译时提示头文件#include <mysql/mysql.h>不存在,百度之后也没解决2. java - yuicompressor-maven-plugin 合并可用却不压缩, 哪配置不对?3. javascript - immutable配合react提升性能?4. node.js - webpack --watch以后报错env: node: No such file or directory5. javascript - nodejs的列表不能往中间插入数据吗?6. html页面中怎么将两个点之间的距离用直线连接起来?7. java - Spring +Mybatis 事务 不能回滚8. node.js - 微信小程序有自己的ws协议,用nodejs的话,还需要nginx干嘛呢9. css3 - 如何出現橫向捲軸?10. JAVA 版本问题?
