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

时间:2016-06-29 10:55:54

标签: javascript node.js variables scope

我在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时第二个变量,会发生什么?这会改变它的范围还是改成别的东西?

2 个答案:

答案 0 :(得分:3)

JavaScript与每种编程语言一样,都有其语法规则 我建议你研究它们,然后再遵循任何建议(你所遵循的那个是可怕的,恕我直言)。

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

    如果您在同一行上有两个(或更多)语句,
  • 必需
  • 可选,如果该语句后面有换行符

另一条规则说您必须使用var关键字来声明变量,其范围取决于此声明发生的位置。

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

    function f() {
        var v;
    }
    

    变量v将具有本地范围,只能在函数f内访问。

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

    var v;
    

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

    < / LI>
  3. 即使您为尚未声明的变量指定了值,例如

    function f() {
        v = "hello world";
    }
    

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

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

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

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