常德公交网站,梅林网站建设,自贡网站制作,杭州网站建设招标前言 在JavaScript中#xff0c;let和 var 都是用来声明变量的关键字 let 和 var 的区别
作用域:
var 声明的变量具有函数作用域#xff08;function scope#xff09;。如果在一个函数内部声明#xff0c;它只在该函数内部可见。如果在一个函数外部声明#xff0c;它会…前言 在JavaScript中let和 var 都是用来声明变量的关键字 let 和 var 的区别
作用域:
var 声明的变量具有函数作用域function scope。如果在一个函数内部声明它只在该函数内部可见。如果在一个函数外部声明它会成为全局变量。let 声明的变量具有块级作用域block scope。这意味着 let 变量只在声明它的代码块如 if 语句、for 循环等中可见。
提升:
var 声明的变量会经历变量提升hoisting这意味着变量可以在声明之前使用但会初始化为 undefined。le 声明的变量也会被升但是不会被初始化所以在声明之前访问它会导致 ReferenceError。
重复声明:
使用 var 可以在同一个作用域内多次声明同一个变量后面的声明会覆盖前面的值。使用 let 在同一个作用域内不能重复声明同一个变量尝试这样做会导致语法错误。
全局对象属性:
当使用 var 在全局作用域下声明变量时它会成为一个全局对象的属性在浏览器中是 window 对象。使用 let 在全局作用域下声明变量时它不会成为全局对象的属性。
暂时性死区:
let 声明的变量存在暂时性死区Temporal Dead Zone, TDZ即在声明之前到声明的位置之间变量是不可见的。var 没有暂时性死区变量在声明之前就可访问只是值 undefined。 // 全局作用域
var a //在全局作用域声明一个a变量
a 5//变量赋值
c //变量声明必须加上关键词let var const常量没有就报错
d 6//变量赋值会先查找查找到window如果没有就声明相当于使用var但是不会预解析再赋值
function fn() {var b6//私有作用域声明一个变量console.log(a)//变量使用在自己作用域查找没有去上一级查找(作用域链)找到了a为5返回5
}
fn()
console.log(b)//错误全局中没有b变量b变量是定义在function里面的是fn私有的全局调用报错
块级作用域和局部作用域区别 块级作用域只要{}没有和函数结合在一起, 那么应该块级作用域 局部作用域函数后面{}中的的作用域, 我们称之为局部作用域 1、在块级作用域中通过var定义的变量是全局变量 2、在局部作用域中通过var定义的变量是局部变量 3、let只要在{}里面就是局部变量 4、无论是在块级作用域还是在局部作用域, 省略变量前面的let或者var就会变成一个全局变量省略之后赋值号必须要不然报错表示直接使用not defined省略之后不会进行预解析相当于给window增加了一个属性名和属性值
//块级作用域{}
{var a 1; // 全局变量let b 2; // 局部变量c 3; // 全局变量
}//函数后的{} 局部作用域
function test() {console.log(d)//undefinedvar d 4; // 局部变量let e 5; // 局部变量console.log(f)//报错Uncaught ReferenceError: f is not definedf 6; // 全局变量 不会预解析console.log(f)//6 赋值了
}
console.log(a)//打印1
console.log(b)//报错
console.log(c)//打印3
test()//执行函数test里面的变量才会预解析将de解析为局部变量f为全局变量变量污染里面的变量会污染全局不执行f变量会出错
console.log(d)//报错
console.log(e)//报错
console.log(f)//打印6