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}'
从输出中可以看到,在等待期间,本地variablesid
被idIn
参数的传入值覆盖。 我通过在simulate
函数的variables声明中简单地添加一个来解决这个问题。
var msg = idIn, //Added comma here. id = idIn
我想这意味着,
如果您只想使用一个var
关键字,
则不能在多个variables声明中省略。 我试图理解什么发生在第二个variablesid
时,
省略? 这是否改变了它的范围,或者是对其他东西做了什么?
和每一种编程语言一样,JavaScript也有它的语法规则。
我build议你在遵循任何types的build议之前(和你所遵循的是可怕的,恕我直言),研究它们。
其中之一就是 (这是用来分隔陈述):
- 在同一行上有两个(或多个)语句时是必需的
- 如果语句后跟换行符,则是可选的
另一个规则是,你必须使用var
关键字来声明一个variables,它的范围取决于这个声明发生的地方。
-
当你在一个函数中声明一个variables时, 例如 :
function f() { var v; }
variables
v
将有一个局部范围, 即它只能在函数f
访问。 -
否则,当你在一个函数之外声明一个variables时, 例如 :
var v;
variables
v
将具有全局范围, 即可以通过同一页上的每个脚本和函数来访问它。 -
即使你给一个没有声明的variables赋值, 例如 :
function f() { v = "hello world"; }
variables
v
将自动成为一个全局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不是故意的。