var net = require('net');
net.createServer(function(socket){
    console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
    var id = '123';
    socket.on('data',function(data){
        console.log(id);
        setTimeout(function(){
            console.log(id);
        },5000);
    });
}).listen(10000,'');

Dans ce code, il devrait imprimer 123 et non défini non? mais il imprime 123 et 123. Selon ma compréhension, setTimeout s'exécute après un certain temps, à ce moment-là, il ne peut pas accéder à la variable id. Je suis vraiment confus. pourquoi est-ce qui se passe et où je me trompe.

0
user3508612 9 mars 2016 à 15:51

3 réponses

Meilleure réponse

Les rappels pour socket.on et setTimeout sont tous deux à l'intérieur de la portée qui définit la var id. Comme aucun rappel ne définit son propre id local, ils affichent tous les deux 123.

2
Orr Siloni 9 mars 2016 à 12:54

Remarque: ce polyfill exécute uniquement le navigateur. Si vous utilisez ce code dans nodejs, vous changez quelque part ..

/*  setTimeout argument supports    */
if (document.all && !window.setTimeout.isPolyfill) {
    var __nativeST__ = window.setTimeout;
    window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
        var aArgs = Array.prototype.slice.call(arguments, 2);
        return __nativeST__(vCallback instanceof Function ? function () {
            vCallback.apply(null, aArgs);
        } : vCallback, nDelay);
    };
    window.setTimeout.isPolyfill = true;
}

if (document.all && !window.setInterval.isPolyfill) {
    var __nativeSI__ = window.setInterval;
    window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
        var aArgs = Array.prototype.slice.call(arguments, 2);
        return __nativeSI__(vCallback instanceof Function ? function () {
            vCallback.apply(null, aArgs);
        } : vCallback, nDelay);
    };
    window.setInterval.isPolyfill = true;
}

Exemple:

setTimeout(function(id){
            console.log(id);
        },5000,"hello");

// 5 secondes puis // bonjour;

Informations détaillées this

Code modifié:

var net = require('net');
net.createServer(function(socket){
    console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
    var id = '123';
    socket.on('data',function(data){
        console.log(id);
        setTimeout(function(id){
            console.log(id);
        },5000, id);
    });
}).listen(10000,'');
0
AhbapAldirmaz 9 mars 2016 à 13:10

Dans ce code, il devrait imprimer 123 et non défini non? mais il imprime 123 et 123.

En effet, la fonction setTimeout n'a pas de variable id locale.

Ce qui suit imprimera la sortie que vous recherchez

 setTimeout(function(){  
        var id;
        console.log(id);
    },5000);

En effet, même si la fonction de setTimeout a également sa propre portée, elle utilisera la portée de la fonction externe si la variable n'est pas définie dans la fonction interne.

0
gurvinder372 9 mars 2016 à 12:52