变量、作用域和内存问题

基本类型和引用类型的值

基本类型值指的是简单的数据段; 引用类型值指那些可能由多个值构成的对象。 不能给基本类型添加属性,可以给引用类型值动态的添加属性。

基本类型按值访问,存放在栈内存中。 引用类型按引用访问,存放在堆内存中,栈内存中存放的是它的地址。

复制引用类型,复制的是栈内存中的地址,所以改变一个变量会影响另一个变量。 不管是栈内存还是堆内存,复制的都是栈内存中的地址。

传递参数

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

function setName(obj){	//这里将要传递一个引用类型的参数,但不是按引用传递,是按值传递
    obj.name = "lee";
}
var person = new Object();//
setName(person);
alert(person.name);		//打印lee
//js没有按引用传参的功能,切记不能把传递引用参数当作按引用传参
复制代码

传参是局部变量

var box = "Lee";
function setBox = {	//通过传参也是局部变量,作用域在setBox()范围下
    alert(box);		//打印"red"
}
setBox("red");
alert(box);			//打印"Lee"
复制代码

检测类型

typeof只能检测基本数据类型 instanceof能检测引用类型的值 语法:

result = variable instanceof constructor
复制代码

使用时构造函数首字母需要大写; 变量和引用类型的值对应返回true,否则返回falseinstanceof在检测基本类型时,始终返回false.

作用域

全局环境被认为是window对象

作用域链

作用域链的用途是保证对执行环境的有权访问的所有变量和函数的有序访问。 在同一作用域中可以互相访问;在不同作用域中,全局环境不能访问局部变量,在局部环境中可以访问全局变量。 作用域链例子:

var box = "Lee";
function setBox(){
	function setColor(){	//setColor()方法作用域在setBox()内
		var b = "kkk";		//b的作用域在setColor()内
		alert(b);			//打印kkk
		return 123;			//返回123
	}
	return setColor();		//调用setColor(),返回123
}
alert(setBox());			//调用setBox(),打印123
复制代码

没有块级作用域

iffor语句的花括号没有作用域的功能。 使用var声明的变量会动被添加到最近的环境中; 查询标识符,现在作用域链的最前端开始搜索,逐步向上级查询,直到找到匹配的标识符, 在变量查询中,访问局部变量要比全局变量更快,因为不需要向上搜索作用域。

垃圾收集

垃圾收集器会在运行的时候给存储在内容中的变量加上标记,然后去掉环境中正在使用变量的标记,没有被去掉标记的标量将被视为准备删除的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值