javascript的变量、作用域

一、复制变量值

JavaScript有两种类型值:基本类型值引用类型值。这两种类型值的复制结果是不一样的。

基本类型值

1 var num1 = 5;
2 var num2 = num1;

 那么num2的值将被赋为5,而且即便是删除num1也不会对它造成影响。

引用类型值

1 var obj1 = new Object();
2 obj1.age = 53 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同样不存在,自然会报错。

原文地址:https://www.cnblogs.com/nonkicat/p/2502122.html