Lyrics


< More and better />


JavaScript变量,作用域和内存

分为两种类型:基本类型和引用类型

基本类型值:每一个数据包含自己特有的数据,只含有一种数据

是按值访问,直接对值进行操作

是保存在变量中 (栈内存)

引用类型:属于包含多个值的一个对象,一个对象包含很多属性

保存在内存中 Javascript 不允许直接访问内存,(不能直接操作对象的内存空间)

自我感觉是操作对象的属性 (堆内存中)

对于引用类型的值,可以动态的添加,删除,修改属性和方法

引用类型的变量实际包含的不是变量本身,而是一个指向该对象的指针

所以当复制一个引用类型时(一变则全变)

创建:

type
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1:
var person=new Object();
person.name="zf"
person.age=18;
alert(person);//弹框显示数据类型
document.write(person.name);
2:
person={name:"zf",age:18};
alert(person);
document.write(person.name);*/
3:使用对象构造器,使用函数
function person(name,age)
{
this.name="zf";
this.age=18;
}
M=new person;
alert(M);
document.write(M.name);
</script>

复制变量基本类型和引用类型的区别;

基本类型;

var n1="11";
var n2=n1;    //n1=n2但是个有自己的内存,互不影响

引用类型:

var n1=new Object();
var n1=n2;

具有一致性:同时指向对中的一个对象(同一个),所以可以相互交换,所包含的属性,操作都一样,是相互影响的

传递参数

所有的函数的参数都是按值传递

<a href="http://www.cnblogs.com/imlucky/archive/2012/11/10/2763949.html">javascript传递参数</a>

#### 检测类型:基本类型数据:typeof  返回值是类型

            var name="11";

            alert(name)  //string

            函数返回function

          引用类型:instanceof  返回值是布尔值

            var person=new Object();

            alert(person instanceof string) //检测是不是字符类型的

            对于基本类型总是返回false

没有块级作用域:变量的作用范围

if(true)
{
var i=1;
}

alert(i) i=1;执行完if语句i 并没有销毁,

!当在函数中所用的变量没有声明变量;则该变量将被添加到全局环境中;当函数执行完时,变量不会释放,因为变成全局变量

所以建议:注意变量的声明

所有变量都含有执行环境(作用域)

执行环境:全局执行环境(执行完毕内存释放 除非自己手动释放内存(优化代码))

函数执行环境(执行函数时才会给分配内存,执行完则释放!!(局部变量一定要声明)不然会称为全局变量)

全局变量不能直接访问局部变量,但是局部变量可以直接访问全局变量,链的作用域,只能向上链中查找

垃圾收集:标记清除法(常用) 和引用计数法