变量提升
- 在代码执行之前,会提前把 带var 和 带 function 的变量提前声明
- 带var 只声明,不定义
- 带function 既声明也定义;在大括号{}中包着的function是只声明不定义的
- 变量提升只提升等号左边的部分;return 后变的也不提升
- let 和 const 是不存在变量提升的,但是有暂时性死区;在声明之前绝对不能调用。
- 堆内存:用来存储引用数据类型
- 栈内存:用来存储值类型,也提供代码运行的环境(作用域)
作用域(scope)
- 代码能够起作用的区域
- 全局作用域:页面一打开就会形成一个全局作用域,只有一个全局作用域
- 私有作用域:函数一执行就会形成一个私有作用域,私有作用域可以有多个
- 块级作用域:针对let 和 const 存在的一种作用域
- 全局变量:在全局声明的变量,我们称为全局变量
- 私有变量:在私有作用域声明的变量,我们称为私有变量,除此之外,形参也是私有变量
- 作用域链:变量的查找机制,在某个私有作用域中,存在某个变量,那么这个变量的取值,它是有自己的一套规律,先在自己的作用域中查找,若不是自己的作用域的变量,则再去上级作用域查找,找到即可,找不到就一直找到window
- 上级作用域:是针对私有作用域来说的,函数执行形成了一个私有作用域,那么这个私有作用域的上级作用域,是由这个函数在哪个作用域中定义的、决定的
函数执行的过程:先开辟一个私有作用域(栈内存),然后形参赋值,之后变量提升,最后代码从上到下执行
function f(){
console.log(1);
return function(){
console.log(2);
return function(){
console.log(3)
}
}
}
f()()()
--------------------------------
var f = a => b => c => a+b+c;
var f = a =>{
return b =>{
return c
}
}