全局作用域
全局作用域中的函数、变量等只会在网页关闭时回收
let title = "live"
function fun(){
let author = "jack"
}
fun()
全局作用域就是系统创建的一片内存空间,里面有全局的函数和变量,而函数每次调用都会开辟一片属于自己的内存空间,这就是局部作用域
局部作用域有他的回收机制,每次函数调用产生的内存空间在函数执行完毕之后就会被销毁。所以就产生每次执行函数时开辟的内存空间都不一样。
let title = "Mant"
function add(){
let n = 1
console.log(++n)
}
fun()//输出2
fun()//输出2
//每次函数执行都会开辟新的内存,把原有的内存回收掉,所以输出的++n永远为2
函数调用,开辟新的内存空间,并且每次开辟的内存空间都不一样。但是如果函数被全局的变量所引用,则会保留函数的空间。
let title = "Mant"
function add(){
let n = 1
return function(){
console.log(++n)
}
}
let a = add()
a()//2
a()//3
块级作用域
块级作用域用于声明在指定块作用域之外无法访问的变量。let和const会使{代码}代码块有临时死区,外部无法访问内部的变量
let、const和var的区别
let声明和var的使用是相同的,都是声明变量。但是var声明会带有变量的提升,但是let声明则不会有,let声明会把变量作用域限制在临时死区里。let声明禁止重复声明
循环中的let和var
使用var声明的函数,会将变量提升到全局作用域中去,在全局中也可以访问到变量
for(var i = 0; i < 3; i++){
console.log(i)
}
console.log(i)
//输出0,1,2,3,4
for(var i = 0; i < 3; i++){
setTimeOut(function(){
console.log(i)
},1000)
}
//输出4,4,4
使用立即执行函数可以解决这个问题
for(var i = 0; i < 3; i++){
(function(i){
setTimeOut(function(){
console.log(i)
},1000)
})(i)
}
//输出0,1,2
使用let也可以达到立即执行函数的效果
闭包
定义
闭包的缺点
- 会导致内存泄露问题,可以在你不需要变量的时候将变量置空就行了