js的变量作用域,和内存问题
1.值类型的操作及原理
var temp1='变量1';
var temp2=temp1;
上面的实例中中,我们创建了两个变量,将temp1的值赋值给了temp2,首先我们要明白,赋值的过程中的原理是怎样的,首先,这两个变量是基本类型的变量。
在Js中基本类型有Null,Undefind,Number,Boolean,string这五种,我们在学习其他的语言的时候,也知道基本类型和引用类型的区别,基本类型是变量标识符代表是内存中的变量存放的内存地址,而且基本类型的变量的值是存在
于栈中的,而引用类型的变量,在栈中存放的是地址,真正存放值的地方是在堆栈中。
那么将temp1的赋值给temp2,实际上是完成了值的副本的复制。但是两个变量内存中的地址是不相同的,相互独立。
2.引用类型变量的操作及原理
var obj1=new Object();
var obj2=obj1;
obj1.Name='我的对象1';
alert(obj2.Name);
可能有些朋友已经知道了运行的结果,弹出的消息是"我的对象1"
可能看到这里,有些朋友就开始迷惑了,为什么弹出来的是这个结果呢?那么我们首先就要分析这个原因了。
当把obj1赋值给obj2的时候,实际上是传递是堆栈中的地址,赋值之后,两个变量在栈中的地址都是指向同一个内存区域,此时,不管你操作的是哪一个对象,另一个对象也会随之改变。
3.参数传递
在其他语言中,我们学习过基本类型和引用类型的传值方式,按值传递(针对于基本类型变量),按引用地址传递(针对于引用类型的变量)。
<script>
//基本类型
var a=1;
//引用类型
var obj=new Object();
obj.num1=3;
//要调用的函数
function Add(num)
{
num++;
return num;
}
var result1= Add(a);//传入基本类型的变量
var result2= Add(obj.num1);//传入引用类型的变量
</script>
执行结果如下:result1=2;result2=4
但是此时a的值仍然是1,而obj.num1的是4。造成这个结果的原因就在于两种类型的变量在传递参数时的方式不一样,基本类型的变量只是将变量的值的副本传给了函数的参数数组arguments的一个元素,在函数内部操作是对于这个元素的操作。而引用类型的变量在参数传递的时候,传递的地址,那么函数内部操作这个元素实际上所指向的地址和传入的引用类型的变量指向的地址是相同的,那么操作元素的同时,也会改变传入的引用类型。