Node js的全局变量(var)和块变量(let,const)混淆



我知道var是nodejs中的一个全局变量,它可以在任何地方访问。

然而,我被以下的例子弄糊涂了

在下文中,global_1是全局变量,因此可以在不混淆的情况下访问它。

var global_1 =1 
function2 = () => {
console.log('global_1 in function2: ' + global_1)
}
main = () =>{
console.log('global_1 in main: ' + global_1)
function2()
}
main()

但如果我把函数2放在help.js中;它表示global_ 1是未定义的;当我导入helper函数时,效果不是和上面的代码一样吗?我把函数2粘贴在同一个文件中?

const helper = require('./helper'); 
var global_1 =1 
main = () =>{
console.log('global_1 in main: ' + global_1)
helper.function2()
}
main()

至于let和const,我的理解是它们只能在{}中访问

但现在,global_1仍然可以被function2访问,即使global_1没有在function2内部定义。难道只有var可以在任何地方访问吗?let,const只能在{}内访问吗?

var global_1 =1 

or  let global_1 =1 
or  const global_1 =1 

function2 = () => {
console.log('global_1 in function2: ' + global_1)
}
main = () =>{
console.log('global_1 in main: ' + global_1)
function2()
}
main()

我知道var是nodejs中的一个全局变量,它可以在任何地方访问。

你错了。

函数内部的var声明了一个作用域为该函数的变量。

函数外的var声明了一个作用域为该模块的变量。

(T.J.指出,有一种边缘情况,如果你在全局上下文(例如node < yourModule.js(中运行代码,而不是将其作为普通模块(node yourModule.js(加载,那么它将不会被视为模块,函数外的var将创建全局(。

但如果我把函数2放在help.js中;它表示global_ 1是未定义的;当我导入helper函数时,效果不是和上面的代码一样吗?我把函数2粘贴在同一个文件中?

否。

变量是";在范围内";由定义的函数所在位置决定,而不是由调用函数的位置决定。

至于let和const,我的理解是它们只能在{}中访问

否。

不能在定义它们的块之外访问它们。

在您的示例中,它们是在任何显式块之外定义的,为了这些目的,是否将整个模块视为块。


var a = 1;
function b () {
var c = 2;
let d = 3;

if (a) {
let e = 4;
var f = 5;
// a b c d e and f are available here
}
// a b c d and f are available here
// e isn't because it is block scoped and this is outside the block
}
// a and b are available here.
// Everything else is scoped to either the function b or the block
// connected to the if statement inside it

最新更新