局部变量与全局变量_Local variable and Global variable

有几个问题:

1.局部变量和全局变量存在于内存的哪个区域?

2.局部变量和全局变量在什么时候被初始化?

3.局部变量真的比全局变量更加好用吗?

4.java与javascript上局部变量与全局变量有什么区别?

下面是个人的研究结果…

1.局部变量和全局变量存在于内存的哪个区域?

java全局变量和静态变量存储在堆里的静态存储区里;而局部变量存在于栈里。JavaScript没有资料特别提到,而其似乎也类似java:

局部变量: 栈区

局部静态变量:静态区

全局变量: 静态区的常量区

全局静态变量:静态区

注:java内存分为:stack segment 、heap segment、code segment 、data segment(静态区)

code segment即方法区:

方法区存放装载的类数据信息包括:

(1):基本信息:

1)每个类的全限定名

2)每个类的直接超类的全限定名(可约束类型转换)

3)该类是类还是接口

4)该类型的访问修饰符

5)直接超接口的全限定名的有序列表

(2):每个已装载类的详细信息

Java 栈内存以帧的形式存放本地方法的调用状态(包括方法调用的参数,局部变量,中间结果等)。每调用一个方法就将对应该方法的方法帧压入Java 栈,成为当前方法帧。当调用结束(返回)时,就弹出该帧。

全局变量和静态变量的区别:

全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变 量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

而javascript和java有许多类似的地方,原始类型的引用被存放在栈中,如Undefined ,Null ,Bollean ,String,而对其他对象等的引用则存放到堆内存中。

而其中有个很大的区别就是java和js在同名变量的使用上存在区别:

js:

var a = 100;

function testResult(){

var b = 2 * a;//函数范围内不会自动查找全局变量

var a = 200;

var c = a / 2;//调用新声明的局部变量a

alert(b);//结果为NaN

alert(c);//结果为100

}

java:

int a = 100;

public int testResult() {

int b = 2 * a;//使用全局变量a

System.out.println(b);//结果为200

int a = 200;

int c = a / 2;//使用已经声明的

System.out.println(c);//结果为100

return c;

}

2.局部变量和全局变量在什么时候被初始化?

java中静态变量在类加载之前进行初始化,而类属性变量(类中的全局变量),在类实例被创建进行初始化,而方法中的局部变量则在此时进行初始化,不同的是必须明确进行赋值,jvm不会对其进行默认赋值。

js在html页面被加载的同时被加载,其执行环境被创建,环境中的全局变量被初始化,若没有进行赋值则给其设置默认值undefined,局部函数里面同样进行这种处理。不同的是:java会要求局部变量设置初始值,而js则无此要求。

3.局部变量真的比全局变量更加好用吗?

几乎所有的文章都在说一句话,局部变量访问速度比全局变量快?具体原因很少有人问及。我来举个例子细说一下:

var a = 3;

function test(){

var b = a;

alert(b); //结果为undefined

var a = 5;

alert(a);//结果为5

}

细想一下b根本无法被访问,何来访问速度快慢之说?再看:

var a = 3;

function test2(){

var b = 5;

var c = a+1;

var d = b+1;

alert(c);//结果为4

alert(d);//结果为6

}

此时d的运算速度快于c,这也许是访问快慢的关键所在。

**

4.java与javascript上局部变量与全局变量有什么区别?**

在java中全局变量有整个环境范围内与类范围内的区别,整个环境范围的变量用静态变量来实现。而js中全局变量则是该页面window对象下的环境变量,无法跨页面共享。

局部变量则类似,唯一区别是java强制要求赋值,而js不要求。