我在JavaScript中看到过不同的编码格式/样式建议。其中之一是在每行末尾省略,
和;
,除非在JSON对象中使用,
。另一种方法是仅使用var
来声明变量并向前缩进第二个变量。
我采纳了这两个建议,这给我带来了一个有趣的错误,我想更深入地了解这个问题。
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 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}'
从输出中可以看出,在等待期间,本地变量id
会被idIn
参数的传入值覆盖。我通过在,
函数的变量声明中添加simulate
来解决问题。
var msg = idIn, //Added comma here.
id = idIn
我想这意味着如果您只想使用一个,
关键字,则多变量声明中不能省略var
。我想了解省略id
时第二个变量,
会发生什么?这会改变它的范围还是改成别的东西?
答案 0 :(得分:3)
JavaScript与每种编程语言一样,都有其语法规则 我建议你研究它们,然后再遵循任何建议(你所遵循的那个是可怕的,恕我直言)。
其中一条规则是;
(用于分隔语句):
另一条规则说您必须使用var
关键字来声明变量,其范围取决于此声明发生的位置。
在函数内声明变量时,例如:
function f() {
var v;
}
变量v
将具有本地范围,即只能在函数f
内访问。
否则,当您在函数外声明变量时,例如:
var v;
变量v
将具有全局范围,即它可以被同一页面上的每个脚本和函数访问。
即使您为尚未声明的变量指定了值,例如:
function f() {
v = "hello world";
}
变量v
将自动成为全局变量。
所以,因为在你的代码中你写了:
var msg = idIn
id = idIn
表示:
var msg = idIn;
id = idIn;
它使id
成为一个全局变量。
答案 1 :(得分:1)
当逗号丢失时,javascript解释器假设您忘记了;
并自行添加。代码现在看起来像这样:
var msg = blabla;
id = x;
所以下一个陈述只是id = x;
。因此,javascript只是将值x
放在全局&父级范围内的现有变量id
中。
当逗号没有丢失时,解释器没有任何内容可以假设 - 它知道你声明了一个新的变量id
,其值为{{1 }}。
Javascript解释器无法猜测你是否错过了分号或逗号,它假设你错过了分号,在某些情况下它会产生意想不到的结果。
我建议你不要继续写这样的代码,至少不是故意的。