声明变量时,我们会用到var,let和const,那么这三者之间到底有何区别,今天就将我所学分享给大家,希望能给大家有所帮助
1、使用var变量时,变量会被自动添加到最接近的上下文。
如果变量未经声明就被初始化了,那么他就会被添加到全局上下文。
//var添加到最近的上下文,即在add函数内部
function add(num1, num2) {
var sum=num1 + num2;
return sum;
}
let result = add(10,20); //30
console.log(sum); //报错:sum在这里不是有效变量
//未经过声明就被初始化,则被添加到全局上下文中
function add(num1, num2) {
sum=num1 + num2;
return sum;
}
let result = add(10,20); //30
console.log(sum); //30
var声明会被拿到函数或全局作用域的顶部。
function fn1() {
var name = 'jake';
}
//等价于
function fn2() {
var name;
name = 'jake';
}
2、ES6新增的let关键字跟var很相似,但它的作用域是块级的,块级作用域由最近的一对包含花括号{ }界定。
if(true) {
let a;
}
console.log(a); //ReferenceError:a 没有定义,因为只在{ }内部有作用
3、var和let不同之处:
a: 重复的var声明会被忽略,重复的let声明会抛出SyntaxError
var a;
var a;
//不会报错
{
let b;
let b;
}
//SyntaxError: 标识符b已经声明过了
b: let的行为非常适合在循环中声明迭代变量。使用var声明的迭代变量会泄漏到循环外部(注意:var对于for和if语句没有作用域,但是对于函数有作用域。),这种应该避免。
for(var i=0; i<10; i++){ }
console.log(i); //10
for(let i=0; i<10; i++){ }
console.log(i); //ReferenceError: j 没有定义
4: ES6中还增加了const关键字。 1:使用const定义表示符,必须进行赋值。2:一经声明,在其生命周期的任何时候都不能再重新赋予新值。 3:常量的含义是指向的对象不能修改,但是可以改变对象内部的属性。
const a; //SyntaxError: 常量声明时没有初始化
const b=3;
console.log(b); //3
//修改对象内部的属性,因为obj指向的是对象地址,地址不修改,但是对象中的属性可以修改
const obj = {
name :"Heli";
age:18;
}
obj.name = "Bela";
obj.age = 17;
建议:在ES6开发中,优先使用const,只有需要改变某一个标识符的时候才使用let。