Node.js 在节点JS中全局引用具有相同局部作用域变量名称的作用域变量

Node.js 在节点JS中全局引用具有相同局部作用域变量名称的作用域变量,node.js,Node.js,我刚从Node JS开始,我想知道下一步是否可行: var a = 'A1'; function foo(a) { console.log(`${a}, ${a}`); } foo('A2'); 这将打印“A2,A2”,我有没有办法得到“A1,A2”因为您已经标记了这个node.js,您的第一个a不是全局变量-它只是一个范围更大的模块变量,实际上是模块函数包装器中的局部变量。所以,它只是一个范围更大的变量 本地a阴影和隐藏范围更大的a。除非它实际上是全局的(这里没有),否则就没有办

我刚从Node JS开始,我想知道下一步是否可行:

var a = 'A1';

function foo(a) {
    console.log(`${a}, ${a}`);
}

foo('A2');

这将打印“A2,A2”,我有没有办法得到“A1,A2”

因为您已经标记了这个
node.js
,您的第一个
a
不是全局变量-它只是一个范围更大的模块变量,实际上是模块函数包装器中的局部变量。所以,它只是一个范围更大的变量

本地
a
阴影和隐藏范围更大的
a
。除非它实际上是全局的(这里没有),否则就没有办法达到更高范围的
a
。您必须更改其中一个的名称,或者将其中一个放入对象中,以便可以通过对象引用它们,而不是作为直接变量引用

在Javascript中解析变量引用时,解释器使用分层查找。首先,它在本地范围对象中查看变量是否在该范围内。如果是,它将获取该值并完成查找。如果在本地作用域中找不到它(并且只有在本地作用域对象中找不到它时),那么它将转到下一个更高的作用域对象并在那里查找。如果在局部范围中找到符号名称,它将不会在更高的范围中查找,并且无法直接引用更高的范围,除非该变量不仅仅是一个裸变量,而是在某个对象内部,并且您可以引用该对象上的属性,而不是直接引用该变量

所以,你可以这样做:

var parms = {a: 'A1'};

function foo(a) {
    console.log(`${parms.a}, ${a}`);
}

foo('A2');
当然,您也可以更改名称:

var a = 'A1';

function foo(b) {
    console.log(`${a}, ${b}`);
}

foo('A2');

当然,技术上是正确的,但正如我的回答所表明的,我发现这种代码不值得“解决方案”…@Amit——正如我的回答清楚地解释的那样,没有办法在更高的范围内直接引用阴影变量。这就是答案。我只是提供了一些其他方法来解决这个问题,因为它不能像OP的代码那样完成。@Amit-而且,你的答案似乎认为第一个
a
是全局的。因为这是node.js,所以它是一个模块,第一个
a
是一个模块变量,而不是全局变量。因为您标记了这个node.js,所以第一个
a
不是全局变量。它是一个模块范围的变量,从技术上讲,它只是更高范围内的局部变量。如果它是全局的,并且被声明为全局的,您可以将其引用为
global.a
,但不是像您在这里声明的那样。@jfriend00谢谢您的更正,正如我告诉您的,我仍然在熟悉这些概念