JavaScript--变量的作用域及内存问题

JS的变量用来存储基本值类型数据与引用类型数据

JS的基本值类型有:Undefined、Null、Boolean、Number、String五种;他们存放于栈内存中,可以直接操作他们的值。

JS引用类型的值是以对象形式存放在堆内存中,JS不允许直接访问堆内存,所以对对象的操作,实际上是在操作对象的引用。

JS的动态属性

引用类型可以为其动态的添加属性和方法、下面代码演示了如何为一个名为person的对象添加name属性:

var person=new Object();
person.name="bobo";
console.log(person.name);

JS的动态属性是给对引用类型数据而言的,对于基本值类型不行。

JS变量的复制

基本值类型数据从一个变量向另一个变量复制后,两个变量相互独立,对他们进行操作互不影响。

引用类型数据从一个变量向另一个变量复制后,两个变量仍然引用的是同一个对象,所以改变其中一个变量,就会影响另一个变量。

var person=new Object();
person2=person;
person.name="bobo2";
console.log(person.name+"---"+person2.name);//bobo2---bobo2

JS执行环境与作用域

JS执行环境中包含变量与函数,最大的执行环境称为全局环境;

JS的每个函数都有自己的执行环境,函数一经执行就会被压进环境栈中,函数执行完毕后会将其从环境栈中弹出。将执行流控制权交给之前的执行环境。

代码在执行过程中,会创建变量的作用域链,作用域是为了保证所有变量与函数能够被有序地访问。

下面代码演示了 当我们在函数中使用某变量时,若在当前环境中找不到改变量,那么就会从当前环境沿着作用域链一级一级搜索,直到搜索到为止。搜不到的话就会产生错误。

var inputname="bigboss";
function Changename() {
    if (inputname=="bobo") {
        inputname="bigboss";
    }else {
        inputname="bobo";
    }
}
Changename();
console.log(inputname);//bobo

当我们在if语句中定义变量或者在for语句中定义变量都会使变量存在于全局环境中。

if (true) {
    var currentvalue=10;
}
console.log(currentvalue);//10
for (var oo = 0; oo < 15; oo++) {
    //dosomething
}
console.log(oo);//15

管理内存

在定义并使用完引用变量后,若该数据不再使用可见该数据设置为null,来解除引用

猜你喜欢

转载自www.cnblogs.com/bigbosscyb/p/12102000.html
今日推荐