javascript - Comment la fonction de rappel accède-t-elle à la valeur sous la fonction actuelle?
大家讲道理
大家讲道理 2017-05-16 13:35:48
0
4
560

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(4)
伊谢尔伦

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);
}
巴扎黑

Mettez bookARR[i] en rappel

左手右手慢动作

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

.
漂亮男人

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal