函数混淆中的变量

时间:2013-07-07 23:05:32

标签: javascript global-variables scope

我想知道是否有人可以帮助我理解为什么函数中的名称与函数之外的名称变量无关。如果你想在函数中更改name的全局变量怎么办呢?

var name = "Paul";

function test(name){
  name = name || 'You';
  console.log(name);
}

test('Mario');

console.log(name);

更新:感谢快速回复的人。所以,如果你逐行运行这就是发生了什么?

一旦你将Mario传递给函数,它会将所有名称实例替换为传递给函数的名称吗?所以反过来你得到:

  "Mario" = "Mario" || 'You';

但如果你什么也没有通过:

test();

然后没有name = name?为什么要采取||声明?

5 个答案:

答案 0 :(得分:2)

var name = "Paul";   

function test(nameInput){
  name = nameInput || 'You';
  console.log(name);
}

关键问题是你有一个同名的本地和全局变量。局部变量优先于全局变量。 重命名输入变量以便能够引用它们。

答案 1 :(得分:1)

您有一个名为name的全局变量和一个名为name的函数参数。当您调用test时,name参数将成为局部变量,遮蔽全局变量。如果要访问全局变量,则必须更改其中一个变量名,以便局部变量/参数不会影响全局变量。

答案 2 :(得分:0)

存在问题 - 参数main清除全局name变量(阴影)的可见性。因此,您应该重命名参数以访问全局参数。

答案 3 :(得分:0)

函数中对name的更改是函数的本地更改。如果要更改全局变量,则需要从函数中返回已更改的name

function test(name){
  name = name || 'You';
  console.log(name);
  return name;
}

name = test('Mario');

对于那些说要为参数使用不同名称的人来说,如果你对范围感到困惑并混合全局变量和局部变量,那么你就无法解决所有问题。

OP似乎想要一个像Python字典get() method一样的函数。如果你得到了范围,那么该函数通常可以用于任何值。如果只更改参数的名称,则只有一个全局变量的函数。

答案 4 :(得分:0)

变量" name"在您的示例中,正在函数的本地范围中重新定义。

为了使其按照您希望的方式工作,您必须将局部变量命名为不同的,以便您可以将全局变量设置为另一个值。

以下是一个示例:

var name = "Paul";

function test(newName){
    name = newName;
    console.log(name); // is now Mario
}

test('Mario');

console.log(name); // reads Mario from the global variable