JavaScript----------变量、作用域和内存问题
1)基本类型和引用类型的值
2.)执行环境及作用域
3)垃圾收集
一)基本类型和引用类型的值
我们在前面讨论了5个基本的数据类型,Undefined、Null、Boolean 、Number、String,这几个都是按值访问的,因为可以操作保存在变量中实际的值
引用类型的值是保存在内存中的对象。
1.动态的属性
定义基本类型值和引用类型值得方法是类似的,创建一个变量并为该变量赋值。然后,对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。
var people=new Object();
people.name="hello";
alert(people.name);
这段代码,我们创建一了一个对象并将其保存在了变量people中,解着又给该对象添加了一个名为name属性
但是如果我们给基本类型的值添加属性会发生什么呢?如下
var people="hello";
people.name = "aaa";
alert(people.name); //结果是undefined
2.复制变量值
基本数据类型,复制变量如下
var n1=3;
var n2=n1;
这样可以得到n2的值为3
引用类型,复制变量图下
var obj1= new Objest();
var obj2=obj1;
obj1.name="hello";;
alert(obj2.name); // "hello"
3.传递参数
传递基本类型时
funcution add(num) {
num++;
return num;
}
console.log(add(10)); //11
传递引用类型时
function setname(obj) {
obj.name="hello";
}
var people=new object();
setname(people);
console.log(people.name); //"hello"
但是,当你在传递的过程中,创建了局部变量,如下
function setname(obj) {
obj.name="hello";
obj= new Object();
obj.name="world";
}
var people=new Object();
setname(people);
console.log(people.name); //"hello"
为什么结果还是hello呢,其实,在函数内部重写obj时,就是一个局部对象的概念了,在函数执行完毕后会被立即销毁
4.检测类型
typeof用来检测一个变量,到底是不是基本数据类型,还是对象。
所有的引用类型的值但是Object的实例。因此,在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true,检测基本数据类型得时候,始终会返回false,因为基本类型不是对象。
二)执行环境及作用域
这个说起来呢,涉及到环境,时JavaScript最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
怎么样?看到上面那段话是不是云里雾里,其实按照我的理解呢,就是每个函数呢,都有自己的执行环境,当进到一个函数后,它就相当于进入了一个环境,但是呢,它的环境中的变量和函数,确实是它自己的,但是它里面要是再进去了其他函数,就是进去了其他环境了,就不能用它的变量了,大概就是全局变量和局部变量的意思吧。
1.延长作用域链
1)通过try-catch语句
2)with语句
这一块内容还不是很明白,以后再补充
2.没有块级作用域
在其他类C的语言中,由花括号封闭的代码块都有自己的作用域,如果在里面声明变量啥的,会在执行完毕销毁。但是JavaScript中,if语句中变量声明将会添加到当前的执行环境。for语句也是这样