一、复制变量值
JavaScript有两种类型值:基本类型值和引用类型值。这两种类型值的复制结果是不一样的。
基本类型值
1 var num1 = 5; 2 var num2 = num1;
那么num2的值将被赋为5,而且即便是删除num1也不会对它造成影响。
引用类型值
1 var obj1 = new Object(); 2 obj1.age = 5; 3 var obj2 = obj1;
虽然obj2.age同样为5,但其实obj1和obj2是指向同一对象,如果更改obj1的值,那么obj2的值也会随之改变。
二、参数传递
JavaScript中的参数传递都是按值传递的,即:在传递的过程中,将函数外的值复制给参数。
因此就会得出以下结果:
基本类型值
1 var num1 = 5; 2 function setValue(obj){ 3 return obj += 10; 4 } 5 var num2 = setValue(num1); 6 alert(num1);//5 7 alert(num2);//15
因为这是一个复制的过程,基本类型的复制不会对原值产生影响,所以在函数内对参数进行计算,并不会改变num1的值。
引用类型值
1 function setAge(obj){ 2 obj.age = 15; 3 } 4 var john = new Object(); 5 setAge(john ); 6 alert(john.age);//15
同理,因为应用类型值的复制,如果在函数中对参数进行重新复制,那么对函数外的原值也会造成影响。
三、作用域
和java、c等一些语言不通,JavaScript是没有块级作用域的。所谓的块级作用域,就是用{}抱起来的执行环境。
如:
1 (function(){ 2 var i = 5; 3 if(i == 5){ 4 var color = "blue"; 5 } 6 alert(color); 7 })();
相似代码下,java中最终会报错,因为if条件执行完后,color已经被销毁。但是JavaScript能正常执行。
没有块级作用域并不代表没有执行环境。
如以下代码:
1 (function(){ 2 var i = 5; 3 if(i == 5){ 4 var color = "blue"; 5 } 6 })(); 7 alert(color);
因为color是在函数内声明的,函数结束后,函数的执行环境已经被销毁,color同样不存在,自然会报错。