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时第二个变量会发生什么,?这是否改变了它的范围或它被用于其他东西?
JavaScript 和每一种编程语言一样,都有自己的语法规则。
我建议您在遵循任何建议之前先研究它们(恕我直言,您遵循的建议很糟糕)。
这些规则之一是;(用于分隔语句):
另一个规则是你必须使用var关键字来声明一个变量,它的范围取决于这个声明发生的位置。
当您在函数内声明变量时,例如:
function f() {
var v;
}
Run Code Online (Sandbox Code Playgroud)
该变量v将具有局部作用域,即它只能在函数内访问f。
否则,当您在函数外声明变量时,例如:
var v;
Run Code Online (Sandbox Code Playgroud)
该变量v将具有全局作用域,即它可以被同一页面上的每个脚本和函数访问。
即使您为尚未声明的变量赋值,例如:
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一个全局变量。
| 归档时间: |
|
| 查看次数: |
6291 次 |
| 最近记录: |