JavaScript----------变量、作用域和内存问题

JavaScript----------变量、作用域和内存问题

1)基本类型和引用类型的值
2.)执行环境及作用域
3)垃圾收集

一)基本类型和引用类型的值

我们在前面讨论了5个基本的数据类型,Undefined、Null、Boolean 、Number、String,这几个都是按值访问的,因为可以操作保存在变量中实际的值
引用类型的值是保存在内存中的对象。

1.动态的属性

定义基本类型值和引用类型值得方法是类似的,创建一个变量并为该变量赋值。然后,对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。

var  people=new Object();
people.name="hello";
alert(people.name);

这段代码,我们创建一了一个对象并将其保存在了变量people中,解着又给该对象添加了一个名为name属性

但是如果我们给基本类型的值添加属性会发生什么呢?如下

var people="hello";
people.name = "aaa";
alert(people.name);  //结果是undefined

2.复制变量值

基本数据类型,复制变量如下

var n1=3var n2=n1;

这样可以得到n2的值为3

引用类型,复制变量图下

var obj1= new Objest();
var obj2=obj1;
obj1.name="hello";;
alert(obj2.name);  // "hello"

3.传递参数

传递基本类型时

funcution add(num) {
	num++;
	return num;
}
console.log(add(10)); //11

传递引用类型时

function setname(obj) {
	obj.name="hello";
}
var people=new object();
setname(people);
console.log(people.name); //"hello"

但是,当你在传递的过程中,创建了局部变量,如下

function setname(obj) {
	obj.name="hello";
	obj= new Object();
	obj.name="world";
}
var people=new Object();
setname(people);
console.log(people.name); //"hello"

为什么结果还是hello呢,其实,在函数内部重写obj时,就是一个局部对象的概念了,在函数执行完毕后会被立即销毁

4.检测类型

typeof用来检测一个变量,到底是不是基本数据类型,还是对象。
所有的引用类型的值但是Object的实例。因此,在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true,检测基本数据类型得时候,始终会返回false,因为基本类型不是对象。

二)执行环境及作用域

这个说起来呢,涉及到环境,时JavaScript最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

怎么样?看到上面那段话是不是云里雾里,其实按照我的理解呢,就是每个函数呢,都有自己的执行环境,当进到一个函数后,它就相当于进入了一个环境,但是呢,它的环境中的变量和函数,确实是它自己的,但是它里面要是再进去了其他函数,就是进去了其他环境了,就不能用它的变量了,大概就是全局变量和局部变量的意思吧。
在这里插入图片描述

1.延长作用域链

1)通过try-catch语句
2)with语句
在这里插入图片描述
这一块内容还不是很明白,以后再补充

2.没有块级作用域

在其他类C的语言中,由花括号封闭的代码块都有自己的作用域,如果在里面声明变量啥的,会在执行完毕销毁。但是JavaScript中,if语句中变量声明将会添加到当前的执行环境。for语句也是这样
在这里插入图片描述
在这里插入图片描述

三)垃圾收集

在这里插入图片描述

发布了17 篇原创文章 · 获赞 25 · 访问量 2028

猜你喜欢

转载自blog.csdn.net/weixin_44142985/article/details/102897059
今日推荐