《JavaScript高级程序设计》总结 第四章 变量、作用域和内存问题

-Javascript的变量分为两种类型:
·基本类型值(用typeof检测类型)
Undifined,Null,Boolean,Number,String

·引用类型值(对象,用instanceof检测类型)

-在复制变量值的时候,基本数据类型是将值复制,复制与被复制的值相互独立;而引用数据类型则是复制指针,它们指向同一对象。

                var a = 10
		var b = a
		b++
		console.log(b)//11
		console.log(a)//10
		
		var obj = {
			name :'john',
			age :'10'
		}
		var newobj = obj
		newobj.name = 'Jam'
		console.log(newobj.name)//Jam
		console.log(obj.name)//Jam

-参数传递
对于基本数据类型,在函数内操作变量无法影响到函数外的变量。

			var num = 10
			function addNum(a){
				a++
				return a
			}
			addNum(num)
			console.log(num);//10
对于引用类型,在函数内操作引用类型数据会被反映到函数外

			var obj = {
				name :'john',
				age :'10'
			}
			function changeObj(obj){
				obj.name = 'jam'
			}
			changeObj(obj)
			console.log(obj)//obj.name为jam

-执行环境、作用域
在创建一个函数的时候,会创建一个执行环境(又称作用域)。
在javascript中,一个执行环境对应着一个变量对象,在该执行环境中所定义的所有变量和函数都保存在这个变量对象中。
在web浏览器中,全局执行环境为window对象。
程序在环境中执行时,会创建一个作用域链。
作用域链的最前端是当前执行环境(用图来表示),查询变量时,是顺着作用域链向后查找。

	outerFunction(){
		var outername = 'outer'
		//这里不能访问到作用域链前端的innername变量
		innerFunction(){
			var innername = 'inner'
			console.log(outername) //这里能访问到作用域链后端的outername变量
		}
	}
}


除了函数有作用域以外,if和for语句块都没有创建块级作用域。
比如:

		if (true) {
			var a = 'blue'
		}
		console.log(a)//blue
此外,在创建变量时,不用 var 关键字会创建全局变量。

-垃圾回收

在栈内存或堆内存中,分配局部变量的空间,一旦函数执行完毕,局部变量就不需要了,此时释放相应的内存
垃圾回收有两种方式:
1)标记清除
垃圾收集器在运行时,会给内存中所有的变量进行标记。然后去掉在当前执行环境中被使用的变量,以及还在被引用的变量。把剩下的全部删掉,从而释放内存。
2)引用计数
跟踪记录每个值被引用的次数,但这种情况会出现循环引用。IE由于BOM和DOM在内核中是以引用计数来回收内存的,因而要注意循环引用的问题
比如:

		var element = document.getElementById('some_element')
		var myObj = new Object()
		myObj.element = element
		element.someObj = myObj
解决的方法为,在不需要的时候,手动断开引用。

		myObj.element = null
		element.someObj = null

-垃圾回收器是周期运行的,ie是根据内存分配量的临界来触发。ie7以上版本的临界可动态调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值