JavaScript / Node.JS中的variables声明和初始化

我在JavaScript中看到了不同的编码格式/样式的build议。 其中之一就是省略, 在每一行的结尾,除非在JSON对象中使用。 另一种是只使用var来声明variables并缩进第二个variables。

我通过了这两个build议,这使我有一个有趣的错误,我想深入了解这个问题。

初始化

 var max = 2 arr = [] wait = 10 //Preset arr with simple object {id:i} for(var i = 0; i < max; i++) arr.push({id:i}) 

主function

 function simulate(idIn, callback) { var msg = idIn id = idIn logger.info(idIn, 'simulate', JSON.stringify({id:id, idIn:idIn})) setTimeout(function() { var obj = {id:id, idIn:idIn} logger.info(idIn, 'init', JSON.stringify(obj)) callback() }, wait) } 

并行执行

 async.map(arr, function(item, cb) { logger.info('map', JSON.stringify(item)) simulate(item.id, cb) }, function(err, result) {}) 

产量

 info: map {"id":0} info: 0 'simulate' '{"id":0,"idIn":0}' info: map {"id":1} info: 1 'simulate' '{"id":1,"idIn":1}' info: 0 'init' '{"id":1,"idIn":0}' //id is overwritten here info: 1 'init' '{"id":1,"idIn":1}' 

从输出中可以看到,在等待期间,本地variablesididIn参数的传入值覆盖。 我通过在simulate函数的variables声明中简单地添加一个来解决这个问题。

  var msg = idIn, //Added comma here. id = idIn 

我想这意味着,如果您只想使用一个var关键字,则不能在多个variables声明中省略。 我试图理解什么发生在第二个variablesid,省略? 这是否改变了它的范围,或者是对其他东西做了什么?

和每一种编程语言一样,JavaScript也有它的语法规则。
我build议你在遵循任何types的build议之前(和你所遵循的是可怕的,恕我直言),研究它们。

其中之一就是 (这是用来分隔陈述):

  • 在同一行上有两个(或多个)语句时是必需的
  • 如果语句后跟换行符,则是可选

另一个规则是,你必须使用var关键字来声明一个variables,它的范围取决于这个声明发生的地方。

  1. 当你在一个函数中声明一个variables时, 例如

     function f() { var v; } 

    variablesv将有一个局部范围, 它只能在函数f访问。

  2. 否则,当你在一个函数之外声明一个variables时, 例如

     var v; 

    variablesv将具有全局范围, 可以通过同一页上的每个脚本和函数来访问它。

  3. 即使你给一个没有声明的variables赋值, 例如

     function f() { v = "hello world"; } 

    variablesv将自动成为一个全局variables。

所以,因为在你的代码中你写了:

 var msg = idIn id = idIn 

意思是:

 var msg = idIn; id = idIn; 

它使id成为一个全局variables。

当逗号缺失时,JavaScript解释器假定您忘记了; 并自行添加。 代码现在看起来像这样:

 var msg = blabla; id = x; 

所以下一个语句就变成了id = x; 。 所以javascript只是将值x放在全局/父级范围内的现有variablesid中。

当逗号没有丢失时,解释器没有任何事情可以假设 – 它知道你声明了一个新的variablesid和值x

Javascript解释器不能猜测你是否错过了分号或逗号,它假设你错过了分号,在某些情况下,它可能会产生意想不到的结果。

我build议你不要继续写这样的代码,至less不是故意的。