英文在线购物网站建设,WordPress 推酷 主题,网络自助服务平台,花店网站模板 html文章目录JavaScript var let区别变量作用域变量提升变量重复声明全局对象属性for循环中的作用域JavaScript var let区别
var和let都是用来声明变量的关键字。
变量作用域
var声明的变量作用域是函数作用域或全局作用域#xff0c;而let声明的变量作用域是块级作…
文章目录JavaScript var let区别变量作用域变量提升变量重复声明全局对象属性for循环中的作用域JavaScript var let区别
var和let都是用来声明变量的关键字。
变量作用域
var声明的变量作用域是函数作用域或全局作用域而let声明的变量作用域是块级作用域。
function test1() {var a 1;if (true) {var a 2;console.log(a);}console.log(a);
}
test1();
// 2
// 2function test2() {let a 1;if (true) {let a 2;console.log(a);}console.log(a);
}
test2();
// 2
// 1说明test1函数中if语句中的变量a覆盖了函数作用域中的变量a因此2次输出都是2.
test2函数中if语句中的a变了只在块级作用域中生效因此第二次输出的a变量为1。
变量提升
var声明的变量会发生变量提升即变量可以在声明前使用而let声明的变量不会发生变量提升
function test1() {console.log(a);var a 1;
}
test1();
// undefinedfunction test2() {console.log(a);let a 1;
}
test2();
// Uncaught ReferenceError: Cannot access a before initialization说明test1函数中因为var声明的变量存在变量提升即使变量a在声明前使用也不会不报错输出undefined。
test2函数中let声明的变量不会发生变量提升因此在声明前使用会报错。
变量重复声明
同一作用域内var声明的变量可以被重复声明而let声明的变量不允许被重复声明。
function test1() {var a 1;var a 2;console.log(a);
}
test1();
// 2function test2() {let a 1;let a 2; //提示错误console.log(a);
}说明test1函数中变量a可以被重复声明最终输出的值为2.
test2函数中变量a不能重复声明报错提示Identifier a has already been declared*。
全局对象属性
在全局作用域下用var声明的变量会成为全局对象的一个属性而let声明的变量不会。
var a 1;
console.log(window.a); // 1let b 2;
console.log(window.b); // undefined说明变量a被声明为全局变量可以通过window对象访问。
变量b不会称为全局对象因此会输出undefined。
for循环中的作用域
在循环语句中用var声明的变量会存在作用域提升和共享的问题而用let声明的变量则不存在这些问题。
function test1() {for (var i 0; i 5; i) {setTimeout(function() {console.log(i);}, 100);}
}
test1();
// 5
// 5
// 5
// 5
// 5function test2() {for (let i 0; i 5; i) {setTimeout(function() {console.log(i);}, 100);}
}
test2();
// 0
// 1
// 2
// 3
// 4说明test1函数中var声明的变量在函数作用域中会发生变量提升问题最终会输出5个5.
test2函数中let声明的变量不存在这些问题会输出0~4。