在Node JS中引用具有相同本地范围变量名的全局范围变量

时间:2016-05-01 22:05:24

标签: node.js

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

var a = 'A1';

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

foo('A2');

这将打印" A2,A2",有没有办法得到" A1,A2"?

1 个答案:

答案 0 :(得分:0)

由于您已标记此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');