01JS变量作用域

Posted 戒奢从简,起早贪黑,努力提升

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01JS变量作用域相关的知识,希望对你有一定的参考价值。

数据类型

基本类型:Number、String、Boolean等。

引用类型:Object、Array等。

 

内存的堆栈

栈内存:一般保存  基本类型数据  和  引用类型数据的地址

堆内存:一般保存  引用类型数据。

注:栈内存可以直接按值可以访问;访问堆内存,先访问栈内存里面的地址。

 

变量的比较

基本类型比较:主要比较 值 跟 类型

引用类型比较:只要地址不一致,就是false

 

值的复制

基本类型:a = b;     //把b的 值 赋给a

引用类型:a=b;      //把b的 地址 赋给a,只要地址里面的值发生变化,a和b都会发生变化

想要复制一份引用类型的数据(浅拷贝)

function(obj){

newObj = {};

for(var p in obj){

newObj[p] = obj[p];

}

return newObj;

}

 

 

参数的传递

参数的传递都是按值传递的。无论基本数据类型还是引用数据类型。

function setName(obj){

obj.name = ‘xm’;

obj = {};

obj.name = ‘xx’;

}

var pp = {};

setName(pp);

console.log(pp.name);    //打印出xm

 

 

类型检测

instanceof:判断  左边对象  是否为  其右边类的实例

如:

var re = 123;

re   instanceof   Number;   //true。判断re是否为number的实例

 

 

变量作用域

全局作用域:定义在全局,作用在全局

局部作用域:如函数作用域,出了函数就访问不到

注意:js没有块级作用域。{ }

 

变量对象和作用域链

变量对象:

var sex = 18;
function a(){
var sex = 18;
}
//window对象sex、a  === window.sex 、 window.a
//a函数对象sex === a.sex

 

 

作用域链:

var sex = 18;
var name = xm;
function a(){
var sex = 18;
console.log(sex);      //优先局部里面的变量
console.log(name);      //若局部里面没有,则会查找全局变量
}       //注意:作用域链里面可以访问外面,但是外面不能访问里面

 

 

延长作用域链:

var person = {};
person.name = ‘xm’;
var score = 44;

with(person){       //用with,给person做延长或修改
sex = ‘male’;       //给person对象添加person.sex
name = ‘bb’;       //修改person.name
score = 0;         //person.score找不到,但在全局找到score,所以修改
}             //尽量少用或者不用with

 

 

JS解析机制

预解析

(变量和函数同名,保留函数;函数和函数同名,保留后面的;)

1、找出window对象,所有的var,并令其等于undefined
2、找出window对象,所有的function,并令其等于函数本身

3、找出function对象,里面的var,并令其等于undefined
4、找出function对象,里面的function,并令其等于函数本身(若没有嵌套函数就跳过)

逐行解析

5、代码一行一行往下读,遇到function就跳过(遇到调用函数的语句,跳到该函数里面去)

 

如:

var name = ‘bb’;
function rr(){
console.log(name);       //这里的name不会跳到window对象外面,因为预解析时,函数里面已经有一个name,并且已经赋值为undefined
var name = ‘yy’;
}

 

 

console.log(name);      //没有var的全局变量,预解析不到。所以会报错
name = ‘bb’;

 

 

<script type=”text/javascript”>
console.log(a);            //在这里会报错,因为预解析是解析完一个script,再去解析script
</script>
<script type=”text/javascript”>
var a = ‘bb’;
</script>

 

 

垃圾收集机制

//释放无用的数据,回收内存。js是自动收集的,object-c是手动收集的

自动收集:找出没用数据,打上标识,释放其内存,周期性执行。

 

标识无用数据的策略

标记清除:给所有的变量打上标记,去掉  环境中的变量,以及  被环境中引用的变量。

引用计数:跟踪每个值被引用的次数,当引用次数变成0时,就会被回收。

当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。

var xm = { name=’123′,age=’14’ };     //这样xm就是1

如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。

xm = {}; 或 xm = null;      //这样就由原来的1再减1。1-1=0

注意:当循环引用时,a中带有b,b中带有a,引用计数就永远回收不到。(ie9以下的DOM采用的是引用计数策略,原生对象是标记清除策略,两种对象相互调用,可能产生循环计数)

 

内存管理

因为   web浏览器   分配到的内存   小于桌面应用程序的内存,所以没用的变量要及时处理。(适用于多数全局变量;局部变量离开就会清除,所以局部用不到)

如:

a = [… , … , … , …];

a = null;      //当a数组用完了,之后不再需要时,就得手动清除内存

以上是关于01JS变量作用域的主要内容,如果未能解决你的问题,请参考以下文章

01.JS块级作用域与let

01JS变量作用域

JavaScript 作用域 与 作用域链

JS 作用域及作用域链

JS 作用域及作用域链

js中变量的作用域