搜索

首页  >  问答  >  正文

javascript - 回调函数如何访问当前函数作用下的值

我在函数中定义了一个数组变量,里面存有6个元素,然后在该函数中调用回调函数,在回调函数中无法访问数组变量的值,但是可以访问length属性。感觉很迷惑,不知道该怎么解决。

for(var i=0;i<bookARR.length;i++){//在该书中写入 有借图书馆id
                //因为图书馆表需要所有书籍的_id,所以检测有时,记录id
                console.log("在外面"+bookARR[i]);//9787539989891 9787533946777 9787569914078 9787513316286 9787218113180 9787535491978
                 Book.getBookByISBN(bookARR[i],function(err,book){
                    if(!book||err){
                        console.log("huidiao"+bookARR.length);//6
                        console.log("在里面"+bookARR[i]);//undefined undefined undefined undefined undefined undefined
                        newBook.push(bookARR[i]);
                    }else{
                        newBook_id.push(book._id);
                    }
                    ep.emit('examine');
                })
            }

Book.getBookByISBN()是我在其他模块定义的函数

大家讲道理大家讲道理2789 天前580

全部回复(4)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:37:48

    因为

    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);
    }
    

    回复
    0
  • 巴扎黑

    巴扎黑2017-05-16 13:37:48

    在callback 中带上 bookARR[i]

    回复
    0
  • ringa_lee

    ringa_lee2017-05-16 13:37:48

    前面已经说了原因了,其实就是在你定义Book.getBookByISBN()这个函数里面的回调调用的地方传入bookArr[i]就好了,理解一下形参和实参

    回复
    0
  • 漂亮男人

    漂亮男人2017-05-16 13:37:48

    这是个典型的异步问题,i的作用域还在其中。
    因为异步等你 getBookByISBN 方法调用callback的时候 i=bookARR.length。这已经越界了,所以是undefined.

    解决方:
    1.闭包
    2.let

    回复
    0
  • 取消回复