JavaScirpt变量可用来保存两种类型值:基本类型值,引用类型值
基本类型值:Undefined,Null,Boolean,Number,String
基本类型及引用类型值特点:
1.基本类型值在内存中占据固定大小的空间,被保存在栈内存中;
2.从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本;
3.引用类型的值是对象,会保存在堆内存中;
4.包含引用类型值的变量实际上包含的并不是对象本身,而是指向该对象的一个指针;
5.从一个对象向另一个对象复制引用类型值,复制的其实是指针,两个变量始终指向同一个对象;
6.确定一个值是那种基本类型可以使用typeof操作符,而确定一个值是那种引用类型要使用instanceof操作符。
关于执行环境:
1.执行环境有全局执行环境和函数执行环境之分;
2.每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
3.函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境;
4.全局环境只能访问在全局环境候中定义的变量和函数,而不能直接访问局部环境候总的任何数据;
5.变量的执行环境有助于确定应该何时释放内存。
垃圾收集
1.离开作用域的值将被自动标记为可回收,因此将在垃圾收集期间被删除;
2.”标记清除”
3.引用计数
4.当代码中出现循环引用现象时,引用计数算法则会导致问题;
5.解除变量引用不仅有助于消除循环引用现象,而且有利于垃圾收集。
函数表达式:
1.函数声明并非函数表达式,函数声明要求有名字,但是函数表达式并不需要,没有名字的函数表达式叫做匿名函数;
2.在无法确定如何引用函数的情况下,递归函数就会变得复杂,而且递归函数的性能并不高;
3.递归函数应始终使用arguments.callee来递归调用自身,不要使用函数名,因为函数名可能会发生变化。
在函数内部定义了其他函数时,就创建了闭包,闭包有权访问包含函数内部的全部变量:
1.在后台执行环境中,闭包的作用连包含着她它自己的作用域、包含函数的作用域和全局作用域;
2.通常函数的作用域及其所有变量都会在函数执行结束后被销毁;
3.但是,当函数返回了一个闭包是,这个函数的作用域将会一直在内存中保存到闭包不存在为止。
使用闭包可以在javascript中创建块级作用域:
1.创建并立即调用一个函数,这样既可以执行其中的代码,又不会在内存中留下对该函数的引用;
2.结果就是函数内部的所有变量都会被立即销毁,除非将某些变量赋值给了包含作用域中的变量。
闭包还可以用于在对象中创建私有变量:
注意:因为创建闭包必须维护额外的作用域,所以过度使用它们可能会占用大量内存。