首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量始终记录为NaN

变量始终记录为NaN
EN

Stack Overflow用户
提问于 2015-12-27 14:06:38
回答 2查看 76关注 0票数 0

有人能给我解释一下为什么每次我用console.log调用我的var clients时,它总是返回NaN吗?

代码语言:javascript
复制
//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;
EN

回答 2

Stack Overflow用户

发布于 2015-12-27 14:20:49

var声明的变量是函数范围的,并在JavaScript中提升。每次输入var clients时,它都会在当前函数的作用域中创建一个变量。

这句话:

代码语言:javascript
复制
var clients = 0;

首先声明变量clients,然后为其赋值0

然后你就在写

代码语言:javascript
复制
(function(){
  var clients = clients + 1;
  console.log("Client = " + clients);
})

然而,这又做了同样的事情:它声明了一个新的变量clients,并将它的作用域限定为函数。这个新的clients变量与初始变量不同。在此函数中,它被遮蔽(即无法访问)。实际上,函数中的clientsundefined

提升意味着变量声明会自动移到函数的顶部。

这意味着语句

代码语言:javascript
复制
var clients = clients + 1;

函数中的等同于

代码语言:javascript
复制
var clients = undefined + 1;

这就是

代码语言:javascript
复制
var clients = NaN;

但是,如果删除了var关键字,则不会创建新变量,而是使用旧变量

代码语言:javascript
复制
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

上的

  • More
票数 1
EN

Stack Overflow用户

发布于 2015-12-27 14:16:02

clients变量有多个声明。

改变这一点

代码语言:javascript
复制
var clients = clients + 1;

代码语言:javascript
复制
clients = clients + 1;

此文件(&T)

代码语言:javascript
复制
var clients = clients - 1;

代码语言:javascript
复制
clients = clients - 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34478041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档