2012-02-25 69 views
0

我有一个全局变量MyGlobalVar和一些代码,看起来像这样:的javascript:通过全局变量的功能

var MyGlobalVar = null; 

function PlayWithMyGlobal() { 
    MyGlobalVar = new Object(); 
    .... adding properties to MyGlobalVar 
    MoreFun(MyGlobal); 
} 

function MoreFun(TheVar) { 
    is TheVar here a local or just a reference to the global? 
} 

如果我通过全局变量,我还受与全球合作? 谢谢。

+0

尼特:**变量从来没有通过**,取而代之的是,*值*,其中*从表达式的评估结果*传递。一个对象(它是一种类型的值) - 它不是一个变量 - 本身是:while *内部*一个“引用被传递”,这是*在规范中没有讨论*并且可以完全描述*与[呼叫分享](http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing),而不会增加重载条款。 – 2012-02-25 22:57:01

回答

2

如果全局变量是一个对象,那么你仍然在使用全局变量。否则,它是一个副本。

如下图所示和注释,您的变量指向相同的全局对象。

var MyGlobalVar = null; 

function PlayWithMyGlobal() { 
    MyGlobalVar = new Object(); // <--- Object 
    MoreFun(MyGlobalVar); // <--- Passing object reference 
} 

function MoreFun(TheVar) { 
    TheVar.test = 'Did I modify global?'; 
    alert(TheVar === MyGlobalVar); // true 
    alert(MyGlobalVar.test);  // "Did I modify global?" 
} 
1

是的,你有一个本地引用全球引用的同一个对象。

一个简单的测试将是...

console.log(MyGlobalVar === TheVar); // should be true 
+0

这个测试是不够的。当'MyGlobalVar'和'TheVar'是原始值时,身份比较('===')仍然显示为真,尽管它们可能已经以不同的方式定义。 – 2012-02-25 22:35:55

+0

@RobW:我正在回答这个问题,其中指出*“我有......看起来像这样的一些代码*”。当然,你并不是说一个对象可以是一个原始的。 – 2012-02-25 22:37:17

+0

当然不是,但顺便说一句,答案似乎是通过使用'==='来测试变量是否指向相同变量的通用检查。当您改述时,我会删除我的评论。 – 2012-02-25 22:39:30

5

如果我通过全局变量,我还受与全球合作? 谢谢。

这取决于你传递变量是否为对象原始numberstringbooleanundefinednull是原语)在第一时间值。对象通过引用和基元按值传递。

在你的情况,你逝去的对象:

MyGlobalVar = new Object(); 

而在JS,对象是通过引用传递。所以你还在研究这个变量。

可以确认它是这样的:

var MyGlobalVar = null; 

function PlayWithMyGlobal() { 
    MyGlobalVar = new Object(); 
    MoreFun(MyGlobalVar); 
} 

function MoreFun(TheVar) { 
    MyGlobalVar.foo = 'I am foo'; // property created here 
} 

PlayWithMyGlobal(); 
console.log(MyGlobalVar.foo); // I am foo 
+0

*'bull' *? :p(“...,undefined,bull是原语”) – 2012-02-25 22:37:59

+3

*“在JS中,对象是通过引用传递的”* - [学生不同意](http://stackoverflow.com/a/9070366/201952) ,但这就是它的普遍理解。 – josh3736 2012-02-25 22:40:00

+0

@RobW:是啊,实际上是'null' :) – Sarfraz 2012-02-25 22:40:17