变量、作用域和内存问题

117 阅读2分钟

变量、作用域和内存问题

JavaScript变量用来保存两种类型的值:基本类型的值和引用类型的值。

基本类型:undefined、null、Boolean、number和string

引用类型:对象

二者具有以下特点:

1. 基本类型的值在内存中占有固定大小的空间,因此被保存在栈内存中;

2. 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;

3. 引用类型的值是对象,保存在堆内存中;

4. 包含引用类型值的变量时间包含的并不是对象本身,而是是一个指向该对象的指针;

5. 从一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终指向的都是同一个变量;

6. 确定一个值是哪种基本类型可以使用typeof操作符,使用instanceof判断是哪一种引用类型

所有变量(基本与引用)都存在与一个执行环境(也称为作用域)中,这个执行环境决定了变量的声明周期,以及那一部分代码可以访问其中的变量。

执行环境总结:

1. 执行环境有全局执行环境和函数执行环境;

2. 每次进入一个新的执行环境,都是创建一个用于搜索变量和函数的作用域链;

3. 函数的局部环境不仅有权访问函数作用域中的变量,而且有权力访问其包含(父)环境,乃至全局环境;

4. 全局变量只可以访问全局环境中的定义的变量和环境,而不能直接访问局部函数执行环境;

5. 变量的执行环境有助于确定合适应该释放内存。

JavaScript是一门具有自动垃圾收集机制的编程语言,编程人员不必关心内存分配和回收问题。

for(var i=0;i<10;i++){
    console.log(i)
}
console.log(i)   // 10

i 变量被定义为全局变量

在js中if()语句中的变量声明会将变量添加到全局变量中,子啊for循环中使用需要格外注意。