有人能给我解释一下为什么每次我用console.log调用我的var clients时,它总是返回NaN吗?
//Imports
var inherits = require('util').inherits,
MultiServer = require('../classes/servers/multi_server.js');
var clients = 0;
function PingServer(servers) {
MultiServer.call(this, servers); //Inheritance
//Basic server setup
this.on('listen', function(params) {
console.log("TCP server listening at", params['TCP'].ip + ":" + params['TCP'].port);
console.log("Socket.IO server listening at", params['Socket.IO'].ip + ":" + params['Socket.IO'].port);
console.log("All systems operational.");
});
this.on('error', function(err, source) {
console.log("Error in " + source + " server:", err.message);
});
//Server behaviour
this.on('connect', function(client) {
console.log("A client has connected.");
var clients = clients + 1;
console.log("Client = " + clients);
//Basic client setup
client.on('disconnect', function() {
console.log("A client has disconnected.");
var clients = clients - 1;
console.log("Clients = " + clients);
});
client.on('error', function(err) {
console.log("A client has experienced an error:", err.message);
});
//Main server behaviour
client.on('message', function(msg) {
client.send(msg); //Ping reply
console.log("Received message:", msg);
});
});
}
inherits(PingServer, MultiServer); //Inheritance
//Exports
module.exports = PingServer;发布于 2015-12-27 14:20:49
用var声明的变量是函数范围的,并在JavaScript中提升。每次输入var clients时,它都会在当前函数的作用域中创建一个变量。
这句话:
var clients = 0;首先声明变量clients,然后为其赋值0。
然后你就在写
(function(){
var clients = clients + 1;
console.log("Client = " + clients);
})然而,这又做了同样的事情:它声明了一个新的变量clients,并将它的作用域限定为函数。这个新的clients变量与初始变量不同。在此函数中,它被遮蔽(即无法访问)。实际上,函数中的clients是undefined。
提升意味着变量声明会自动移到函数的顶部。
这意味着语句
var clients = clients + 1;函数中的等同于
var clients = undefined + 1;这就是
var clients = NaN;但是,如果删除了var关键字,则不会创建新变量,而是使用旧变量
var clients = 0;
(function(){
clients = clients + 1; // clients = 0 + 1 === 1;
console.log("Client = " + clients); // "Client = 1"
})而且,将clients = clients + 1写成clients++可能更好。
Javascript function scoping and hoisting
上的
发布于 2015-12-27 14:16:02
clients变量有多个声明。
改变这一点
var clients = clients + 1;至
clients = clients + 1;此文件(&T)
var clients = clients - 1;至
clients = clients - 1;https://stackoverflow.com/questions/34478041
复制相似问题