在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。
例如:
{
var i = 9;
}
console.log(i); // 9
ES6新增的let,可以声明块级作用域的变量。
{
let i = 9; // i变量只在 花括号内有效!!!
}
console.log(i); // Uncaught ReferenceError: i is not defined
注:
1.js中let和var定义变量的区别主要体现在作用域的不同。var定义的变量是全局变量或者函数变量。let定义的变量是块级的变量。也就是说,let只对它所在的最内侧块内有效,而var的范围至少是一个函数之内(即函数变量)。例如:
function myFunction(){
while(1){
let let1 = 2;
var var1 = 2;
}
alert(let1); //不可访问
alert(var1); //可以访问
}
2…而且,用let关键字定义的变量不能被let和var对同一变量进行声明,否则会报错;而使用var关键字定义的变量也只能使用var对同一变量进行再一次的声明。
使用var声明的变量与未使用let和var声明的变量(未声明的 JavaScript 变量)
如果把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
这条语句:
// 此处可调用 carName 变量
function myFunction() {
phoneName= "honor9i";
// 此处可调用 phoneName变量
}
将声明 window 的一个属性 phoneName。
非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除。
var var1 = 1; // 不可配置全局属性
var2 = 2; // 没有使用 var 声明,可配置全局属性
console.log(this.var1); // 控制台将输出 1
console.log(window.var1); // 1
delete var1; // 无法用delete删除用var 声明的变量var1
console.log(var1); //由于上一个语句并没与起任何作用,因此,此语句可以在控制台正常显示
delete var2; //由于var2并没有使用var关键字进行声明,因此可以用delete语句进行删除
console.log(delete var2); // true
console.log(var2); // 由于var2已经被delete删除,因此控制台把这条语句标红,报错,此时var2变量不存在
好啦,今天就先说到这里吧