js中const、let、var的区别
作者:bin1、const
const往往会被人解释为常量,即定义了不能改变,其实这是不对的。
实际上是const定义的内存地址不能改变,值是可以改变的,这一点我们可以在如下看出来:
const data = []; data = [] // 报错,不能改变原内存地址 data.push(1); //正常,可以改变他的值
//如下情况会报错,让人以为const定义的值不能被改变
const data = 1; data = 2;
2、var
通过var定义的变量,作用域是整个封闭函数,是全域的
var tmp = 123; if (true) { tmp = 'abc'; //正常 }
通过var定义变量时,执行js预编译会将变量声明提前到作用域最头部:
var 的情况 console.log(foo); // 输出undefined var foo = 2;
相当于
var foo; //声明且初始化为undefined console.log(foo); foo=2;
如果这样,就会报错,因为整个作用域都未定义foo
console.log(foo);
3、let
let是块级作用域,函数内部使用let定义后,对函数外部无影响。
下面2段代码可以明显看出var和let段区别,一个是块级,一个是整个封闭函数级
for (let i = 0; i < 10; i++) { // ... } console.log(i); //报错,let仅限定于括号内使用
for (var i = 0; i < 10; i++) { // ... } console.log(i); //正常
下面虽然在外面声明了tmp,但在if但作用域中声明了let,那么他就绑定了这个作用域,在他声明之前调用就会报错。
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
这样就可以了
var tmp = 123; if (true) { let tmp; tmp = 'abc'; // ReferenceError console.log(tmp); } console.log(tmp);