@TOC
前言
let和var的区别
- let是ES6引入的关键字,var属于ES5规范
- let具有块级作用域概念,var属于全局作用域
- let变量提升会出现暂时性死区,也相当于在暂时性死区调用变量;var的声明的变量都会被提升到其作用域最顶部
- let定义的变量不存储在window对象中;var在非严格模式下,var定义的变量会绑定到window对象上
- let不允许重复声明,var可以
- let定义变量有块级作用域;var定义的变量没有块级作用域的概念
if(true){
var a = 10;
}
console.log(a); //10
a作为全局变量,可以打印出来
if(true){
let b = 20;
}
console.log(b);//ReferenceError: b is not defined
b相当于局部变量,不在其作用域内则出错
- let变量提升会出现暂时性死区,也相当于在暂时性死区调用变量;var的声明的变量都会被提升到其作用域最顶部
console.log(m); //ReferenceError: Cannot access 'm' before initialization
let m = 3;
console.log(m);
ReferenceError: Cannot access 'm' before initialization出现说明实际上let声明之前的变量已被提升到顶端了,但是由于变量是存储在暂时性死区里面,当被访问执行这个变量时是不被允许的
console.log(i); //undefined
var i = 2;
console.log(i); //2
// 相当于
var i = undefined;
console.log(i); //undefined
var i = 2;
console.log(i); //2
var声明的变量在没有被声明之前使用可以提升到全局作用域,就是说没有被声明却访问执行的变量可以编译而不出错
- let定义的变量不存储在window对象中;var在非严格模式下,var定义的变量会绑定到window对象上
<script>
let i = 1;
console.log("i" in window); //false
console.log(window.i);
</script>
false出现说明let定义的变量并不存储在window对象中
<script>
var i = 2;
console.log("i" in window); //true
console.log(window.i); // 2
</script>
在非严格模式习,通过var定义的变量会绑定到window对象上
引申
问Ⅰ:var好还是let好?
let好,所以放弃使用var。let是ES6为了修复var造成的bug,可以将let看做成var的进化版。
问Ⅱ:var定义的变量和window全局变量的区别?
- var定义的变量有变量提升,window没有
- var在函数中定义的变量在函数外不能访问,window可以
- var定义的变量不能使用
关键字delete删除,window可以
- var定义的变量有变量提升,window没有
<script>
var i = undefined;
console.log(i); //undefined
var i = 2;
console.log(i); //2
</script>
<script>
console.log(c)//c is not defined
window.c = 2;
console.log(c);
</script>
- var在函数中定义的变量在函数外不能访问,window可以
<script>
function fn(){
var p = 2;
window.q = 3;
}
fn() // 调用函数
console.log(p); //p is not defined
console.log(q); // 3
</script>
- var定义的变量不能使用
关键字delete删除,window可以
<script>
var a = 2;
window.b = 3;
delete a;
delete c;
console.log(a); //undefined
console.log(c); // 2
</script>
总结
每天一个前端基础知识总结和记录,每天都是要学习的一天。