JavaScript/Node.JS中的变量声明和初始化
Variable declaration and initialization in JavaScript/Node.JS
我在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
会发生什么?这是否改变了它的作用域,或者它被做成了别的东西?
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
成为全局变量
当缺少逗号时,javascript解释器假定您忘记了;
并自行添加。代码现在看起来像这样:
var msg = blabla;
id = x;
那么下一个语句就变成了id = x;
。因此,javascript只是将值x
放在全局/parent作用域的现有变量id
中。
当逗号没有丢失时,解释器就没有什么可以假设的了——它知道你声明了一个值为x
的新变量id
。
Javascript解释器无法猜测您是否遗漏了分号或逗号,它假设您遗漏了分号,并且在某些情况下可能会产生意想不到的结果。
我建议你不要继续写这样的代码,至少不是故意的。
- 使用同一对象中的其他变量声明变量
- 如何将变量声明为全局变量
- 如何将变量声明为全局变量?用case foreach?Javascript
- 理解bootstrap.js变量声明
- 将 Javascript 变量声明为 PHP 形式
- 单个逗号分隔的变量声明和多个声明之间的区别是什么
- Do变量声明初始化函数
- Javascript变量声明:什么是“;var myVariable={}”;
- javascript中不同类型的变量声明
- 为什么在循环的Javascript中包含变量声明
- for 循环中必需的变量声明
- JavaScript 中的变量声明
- 在 Javascript 变量声明中使用逗号
- 你能在变量声明中添加条件吗?
- JavaScript 全局变量声明
- 节点.js变量声明和作用域
- 具有多个逗号分隔值的变量声明是什么意思(例如 var a = b,c,d;)
- 移动图像 ..JavaScript 将变量声明为字符串
- 让 javascript 将(默认情况下)未声明的变量声明到当前本地范围(基于首次使用)而不是全局范围
- 循环中的变量声明