recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - Comment la fonction de rappel accède-t-elle à la valeur sous la fonction actuelle?

J'ai défini une variable tableau dans la fonction, qui contient 6 éléments, puis j'ai appelé la fonction de rappel dans la fonction. La valeur de la variable tableau n'est pas accessible dans la fonction de rappel, mais l'attribut length est accessible. Je me sens très confus et je ne sais pas comment le résoudre.

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() est une fonction que j'ai définie dans d'autres modules

大家讲道理大家讲道理2747 Il y a quelques jours545

répondre à tous(4)je répondrai

  • 伊谢尔伦

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

    Parce que

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

    Alors

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

    répondre
    0
  • 巴扎黑

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

    Mettez bookARR[i] en rappel

    répondre
    0
  • ringa_lee

    ringa_lee2017-05-16 13:37:48

    La raison a déjà été mentionnée. En fait, il s'agit simplement de passer dans bookArr[i] où vous définissez l'appel de rappel dans la fonction Book.getBookByISBN(). Comprendre les paramètres formels et les paramètres réels

    .

    répondre
    0
  • 漂亮男人

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

    Il s'agit d'un problème asynchrone typique, et la portée de i y est toujours.
    Parce que je t'attends de manière asynchrone getBookByISBN 方法调用callback的时候 i=bookARR.length。这已经越界了,所以是undefined.

    Solution :
    1. Fermeture
    2.let

    répondre
    0
  • Annulerrépondre