2013-07-07 176 views
0

我想知道是否有人能够帮助我理解为什么函数中的名称与函数外部的名称变量无关。如果你想在函数内改变名称的全局变量,那有什么办法呢?函数内部的变量混淆

var name = "Paul"; 

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

test('Mario'); 

console.log(name); 

更新:感谢您的快速回复家伙。所以,如果你一行一行地运行它,这是怎么回事?

一旦你将马里奥传递给函数,它将用传递给该函数的名字替换所有名称实例?所以反过来你:

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

,但如果你通过什么:

test(); 

然后不姓=名字?为什么需要||声明?

+0

你不能打电话给你的函数的参数以不同的方式? –

+0

如果这个变量是真正的全局变量,希望它不是,你可以使用'window.name'来引用它(假设你在浏览器环境中)。 –

+0

@ go-oleg:如果它在全局范围内,事情可能会有点有趣:'window.name'已被用于[其他东西完全](https://developer.mozilla.org/en-US/文档/网络/ API/window.name)。 – icktoofay

回答

2
var name = "Paul"; 

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

关键问题是您有一个本地和全局变量具有相同的名称。局部变量将优先于全局变量。 将输入变量重命名为能够引用两者。

+0

为何选择投票? – TGH

+0

我没有downvote,但我认为有一点解释是必要的。 – icktoofay

+0

我同意。用一些更多的文字更新 – TGH

0

存在问题 - 参数main清除了全局变量(阴影)的可见性。所以你应该重新命名参数来访问全局参数。

1

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

0

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

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

name = test('Mario'); 

大家谁在说使用不同的名称为参数,即简化版,地址都可以遇到,如果你感到困惑的范围和混合全局和局部变量的问题。

看来OP想要一个像Python字典get() method一样工作的函数。如果你得到了作用域,这个函数通常可以用于任何值。如果您只是更改参数的名称,则只有一个全局变量的函数。

+1

我不太确定他们对范围感到困惑;你确实可以改变它来返回一个值而不是改变一个全局变量的值,但是有些情况下你会希望一个函数改变一个全局变量的值。如果该函数的名字是'changeName',说什么?有人可能会认为这样做是不好的设计,但这不是问题的关键。 – icktoofay

+0

为什么不一箭双雕杀死两只鸟?问题的关键在于范围和理解范围应该导致更好的设计。所以,让我们不要提出导致糟糕设计的建议:-) –

+0

嘿,伙计们,感谢您花时间回答我的问题。这只是一个令我困惑的例子,我知道这个命名非常糟糕,但我真的很想知道幕后发生了什么事情,导致它不会像在函数内设置另一个全局变量一样。 – MarioD

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