**说道作用域,先要说变量了,var let const
1,var是es6之前的变量声明,let和const是es6提出的声明方式
2,var是函数作用域,let和const是块级作用域
3,var和let可以修改的变量值,const是不可修改的常量值
4,var可以重复声明,let和const不可以重复声明
下面展示一些 变量声明和js语句执行
var a = 1,b = 2;
add(a,b);
function add(a,b) {
return a+b
}
**说这个就是为了下面说自由变量(储值内存的值),闭包就是为了防止全局的自由变量污染,但是又可以使用的
下面展示一些 闭包。
var a;
function num () {
var a = 2;
return () => {console.log(a)}
}
a = 1
let number = num()
number()
//执行结果是2
**因为变量的链接是在声明的时候建立的,而不是在执行的时候,在num()没有调用之前,console中的a的值在储值内存中已经拿到,变量取有个规则是向上查找,父级,祖级,只要找到就不在想上级找,在这个题中,外面的a和num函数中的a分别在变量内存中分配了两个空间,所以在执行的时候你拿到的是2而不是1
**闭包,自由变量,回调函数,作用域,声明拿到而不是执行,这几个地方很关键