一. 基础概念
- 变量的两种数据类型:基本类型值 (简单的数据段), 引用类型值(多个值构成的对象)
- 基本数据类型 : null ,undefined ,boolean, number,string (新增两种: bigint symbol)
- 基本类型 在栈内存中 有固定大小 引用类型保存在内存中 ,操作时是对操作对象的引用(添加/删除除外)
- 不能给基本类型加属性
- 复制一个基本类型的值,会在栈上创建一个新的值(互不影响)
- 复制一个引用类型的值,则是复制一份值,指针指向同一个堆的地址
- 访问变量的两种方式 按照值 / 按照引用
- 检测类型 typeof XX / xx instanceof AAA
二.重要概念
- 执行环境 - 变量对象
- 全局环境是最外围的执行环境 window 对象
- 每个函数都有自己的执行环境
- 代码进入执行环境会生成作用域链
三.代码说明
1.函数的作用域问题
// 2.函数作用域问题
// 知识点:作用域链向上查找变量,最上层为win
var color = 'red';
function changeColor() {
var color2 = 'blue';
function swapColor() {
var temp = color2;
color2 = color;
color = temp;
console.log(color,color2,temp,"1111") // blue red blue 原因1:函数在win 中可访问win中变量 color 也可以查找到父级的参数
}
console.log(color,color2,temp,"2222222") // blue red undefined //原因2:环境不能向下搜索自己的子函数变量的部分
swapColor()
}
changeColor()
console.log(color, color2, temp, "333333") // blue undefined undefined 原因3:color 在全局环境中 是win的环境变量
2.变量的声明
- 使用var声明的变量会被添加到最近的环境中
// 3.变量声明
// 不声明会变成 全局变量 声明了var才能成为局部变量
function add(num1, num2) {
var sum = num1 + num2;
sum2 = num1 + num2;
return sum;
}
add(1, 2)
console.log(sum) //sum is not defined , var 定义的变量会添加到最近的环境中 也就是 fn:add()
console.log(sum2)// sum2 : 3 , 没有用var 申明成为全局变量