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

Variable declaration and initialization in JavaScript/Node.JS

本文关键字:变量 声明 初始化 Node JS JavaScript      更新时间:2023-09-26

我在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}'

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

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

我想这意味着如果您只想使用一个var关键字,则不能在多变量声明中省略,。我试图了解当,被省略时,第二个变量id会发生什么?这是否改变了它的作用域,或者它被做成了别的东西?

JavaScript和其他编程语言一样,也有自己的语法规则。
我建议你在接受任何建议之前先研究一下它们(恕我直言,你所遵循的建议很糟糕)。

其中一条规则是;(用于分隔语句):

  • 必需当你有两个(或更多)语句在同一行
  • 可选的如果语句后面有一个换行符

另一个规则说你必须使用var关键字来声明一个变量,它的作用域取决于这个声明发生在哪里。

  1. 当你在函数内部声明一个变量时,例如:

    function f() {
        var v;
    }
    

    变量v将具有本地作用域,即:只能在f函数内访问

  2. 否则,当你在函数外声明一个变量时,例如:

    var v;
    

    变量v将有一个全局作用域,即:

  3. 可以被同一页面上的所有脚本和函数访问。
  4. 即使您将值赋给未声明的变量,例如:

    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解释器无法猜测您是否遗漏了分号或逗号,它假设您遗漏了分号,并且在某些情况下可能会产生意想不到的结果。

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