近期在学习JavaScript,看到申明变量有点懵,怎么一会var一会let,更有甚者不用关键字申明,于是整理了一下,主要来源MDN文档,如有不严谨的地方以及错误,还望读者指正。
var和let区别:
-
var和let声明后未赋值,表现相同,都是undefined。
-
使用未声明的变量,表现不同。var正常输出undefined,而let声明的变量会报错 ReferenceError: letTest is not defined 严格模式下
-
重复声明同一个变量时,表现不同:var可以更改,而let再次声明变量时,会报错SyntaxError: Identifier ‘letTest’ has already been declared
-
let
声明的变量只在其声明的块或子块中可用,这一点,与var
相似。二者之间最主要的区别在于var
声明的变量的作用域是整个封闭函数。
function varTest() {
var x = 1;
{ //块
var x = 2; // 同样的变量! 因为在同一个函数里面
console.log(x); // 2
}
console.log(x); // 2
}// 函数外依旧访问不到var变量
function letTest() {
let x = 1;
{
let x = 2; // 不同的变量 这个x封在了块中
console.log(x); // 2
}
console.log(x); // 1
}
function NONETest() {
x = 1;//全局的
{
x = 2; // 不同的变量
console.log(x); // 2
}
console.log(x); // 2
}
- 变量作用范围不同:let 语句声明一个块级作用域的本地变量,
var
声明的变量只能是全局或者整个函数块的。var
和let
的不同之处在于后者是在编译时才初始化。let
不像var
一样,let
不会在全局对象里新建一个属性。位于函数或代码顶部的var
声明会给全局对象新增属性, 而let
不会。
var x = 'global';
let y = 'global';
console.log(this.x); // "global" var会在全局对象新建属性
console.log(this.y); // undefined let不会新建全局属性
- 还有非声明变量。未能声明变量将很可能导致意想不到的结果。因此,建议始终声明变量,无论它们是在函数还是全局作用域内。
var x = 0;
function f(){
var x = y = 1; // x在函数内部声明,y不是!
}
f();
console.log(x, y); // 0, 1
// x 是全局变量。x的值还是0,并不是1
// y 是隐式声明的全局变量。
-------------------------------------
function x() {
y = 1; // 在严格模式(strict mode)下会抛出 ReferenceError 异常
var z = 2;
}
x();
console.log(y); // 打印 "1"
console.log(z); // 抛出 ReferenceError: z 未在 x 外部声明
//隐式声明的变量总是全局的。而var声明变量的作用域限制在其声明位置的上下文中。
var x = 0; // x是全局变量,并且赋值为0。
function a() {
var y = 2; // y被声明成函数a作用域的变量,然后赋值成2。
function b() {
x = 3; // 全局变量x被赋值为3,不生成全局变量。
y = 4; // 已存在的外部函数的y变量被赋值为4,不生成新的全局变量。
z = 5; // 创建新的全局变量z,并且给z赋值为5。
} // (在严格模式下(strict mode)抛出ReferenceError)
b(); // 调用b时创建了全局变量z。
console.log(x, y, z); // 3 4 5
}
a(); // 调用a时同时调用了b。
console.log(x, z); // 3 5
console.log(typeof y); // undefined,因为y是a函数的本地(local)变量。
个人总结:
(1)隐式声明的变量,是全局的,并且值也是最新赋的值。
(2)let和var声明的变量,如果先声明在函数外,var x=0然后在函数中又重新声明一次var x=1,最后函数外访问不到函数中重新声明的变量的新的值,因为声明的变量只在其声明的块或子块中可用,在函数中申明的x是新的变量。
(3)let只能在其块中{}有效,而var作用域在整个当前函数中.如果let只声明在函数中,也只在函数中有效。