【发布时间】:2016-11-01 00:59:03
【问题描述】:
我在 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 会发生什么?这会改变它的范围还是让它变成别的东西?
【问题讨论】:
-
省略
,运算符会导致自动分号插入 (ASI):var msg = idIn; id = idIn;现在省略了var关键字。由于您的变量声明在本地范围内,id获得一个全局变量。 -
我发现这篇文章可能对你有所帮助:benalman.com/news/2012/05/multiple-var-statements-javascript
-
无论您在哪里获得此建议,都不要再访问该网站。
-
值得一提的是,声明 'use strict' 可以帮助您更快地发现这一点。
-
谢谢大家。这消除了疑虑。
标签: javascript node.js variables scope