有几个问题:
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不要求。