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.
3 réponses
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.
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,'');
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.
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.