JS-第四章:变量,作用域和内存问题总结

一.类型说明

数据类型:基本数据类型和引用数据类型
基本数据类型:number, string(值)等
引用数据类型:Obj(引用)
基本数据特性:基本数据类型的值保存在栈中(有固定的内存大小),作为函数参数使用,传递的是值
引用数据特性:引用数据类型的对象保存在堆中,作为函数参数,传递的是指针

例子(传入值和引用的区别): 

let obj1 = {
    num:2
};

let obj2 = {
    fun:function(num){
        return ++num;
    }
}
//第一种情况,传递的是obj1.num(基础类型),属于值传递,
alert(obj2.fun(obj1.num));    // 3
alert(obj1.num);              // 2

//第二种情况,传递的是一个引用类型(对象),可以直接改变该对象的值
//因为这个参数使用的时候会创建一个变量,该变量指向传入对象的内存
obj2 = {
    fun:function(obj){
        return ++obj.num;
    }
};
alert(obj2.fun(obj1));  //3
alert(obj1.num);        //3

注意:函数的参数其实是一个赋值过程,如果参数是值则创建一个基本类型,如果参数是一个引用类型,则创建一个引用类型变量,该变量指向传入参数的内存(操作该参数时,相当于操作传入变量指向的内存)

二.引用类型的特点

引用类型赋值的本质:一个引用类型变量a赋值给另一个引用类型变量b,这个过程是a把保存引用类型内存地址的值赋值给b;

然后操作其中一个的对象都会同时改变另一个的对象,因为他们操作的是同一个内存

注意:解除引用的方法 obj = null;


let a = {
    num : 1
}

let b = obj1;

a.num = 2;  
alert(b.num);  //2

三.执行上下文

1.程序执行的每一步都会有一个上下文环境,简称环境

2.环境就像栈,入栈时处于被激活状态(运行到某函数)

3.搜索变量时优先处于激活状态的环境,搜不到在往栈的上一层查找

4.一直找不到则为undefined;

注意:有个特殊变量搜索,函数被引用的地方和创建的地方不一样,而且有相同名字的变量值,此时,取得变量为创建函数的环境下的变量

四.琐碎知识点

1.js函数内的变量如果没有声明会认为是全局环境所属,而ts则会报错,因为没有声明的变量如法使用

2.变量的上下文搜索,其实在局部环境中查找,没有找到在网上一层环境中查找,不过本质:非局部内的变量查找是在定义函数的环境中查找

3.垃圾回收机制:标记回收,引用数回收

4.我们不能给基本类型的值添加属性,js添加属性不会报错,ts直接报错

猜你喜欢

转载自blog.csdn.net/xiaye_go/article/details/82316439