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

Lee*_*Lee 2 javascript variables scope 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})
Run Code Online (Sandbox Code Playgroud)

主功能

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)
}
Run Code Online (Sandbox Code Playgroud)

并行执行

async.map(arr, function(item, cb) {
    logger.info('map', JSON.stringify(item))
    simulate(item.id, cb)
}, function(err, result) {})
Run Code Online (Sandbox Code Playgroud)

输出

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}'
Run Code Online (Sandbox Code Playgroud)

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

    var msg = idIn, //Added comma here. 
        id = idIn
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lla 5

JavaScript 和每一种编程语言一样,都有自己的语法规则。
我建议您在遵循任何建议之前先研究它们(恕我直言,您遵循的建议很糟糕)。

这些规则之一是;(用于分隔语句):

  • 需要时,你必须在同一行上两个(或更多)语句
  • 如果语句后跟换行符,则是可选

另一个规则是你必须使用var关键字来声明一个变量,它的范围取决于这个声明发生的位置。

  1. 当您在函数内声明变量时,例如

    function f() {
        var v;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    该变量v将具有局部作用域,它只能在函数内访问f

  2. 否则,当您在函数外声明变量时,例如

    var v;
    
    Run Code Online (Sandbox Code Playgroud)

    该变量v将具有全局作用域,它可以被同一页面上的每个脚本和函数访问。

  3. 即使您为尚未声明的变量赋值,例如

    function f() {
        v = "hello world";
    }
    
    Run Code Online (Sandbox Code Playgroud)

    该变量v将自动成为全局变量。

所以,因为在你的代码中你写了:

var msg = idIn 
    id = idIn
Run Code Online (Sandbox Code Playgroud)

意思是:

var msg = idIn;
id = idIn;
Run Code Online (Sandbox Code Playgroud)

它使id一个全局变量。