let、var、const的区别

先看let和var:浏览器

1. 函数

console.log(a); // undefined
var a = 3;
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 3;
 
在当前代码执行以前,首先会把全部带var关键字的进行声明(带function关键字的也会提早声明而且定义),即所谓的变量提高,let则不存在这种状况。
ps:项目中建立函数,通常都是基于函数表达式来实现,这样防止其提早变量提高,如:
 
let fn = function () {};

 

2.spa

var x = 3;
console.log(window.x); // 3

let y = 3;
console.log(window.y); // undefined
 
用var进行全局变量声明的时候,也会给全局对象(浏览器中即window)增长一个对应的属性;可是用let声明的变量不存在这个特色。
仅限于全局变量建立时有这个特色,属于私有的执行上下文中建立的私有变量没有这个特色。
 
function fn() {
    var x = 1;
    y = 2;
    console.log(fn.x); // undefined
    console.log(fn.y); // undefined
}
fn();
console.log(window.x); // undefined
console.log(window.y); // 2

 

3.指针

var y = 21;
var y = 24;
console.log(y); // 24
console.log('OK'); // Uncaught SyntaxError: Identifier 'x' has already been declared
let x = 21;
console.log(x);
let x = 24;
console.log(x);
 
能够看到,用var声明同一个变量屡次,前边声明的会被覆盖以最后一次赋值为准,而用let声明同一个变量屡次时,并非在let声明同一变量第二次时报错,浏览器显示在代码第一行就有报错。
由于一段代码在浏览器执行时,大致须要通过编译阶段和代码解析阶段,用var的能够重复声明,是由于在编译阶段中的词法解析阶段能够审核过,执行阶段遇到已经声明过的,不会再从新声明;可是用let的不能够,是由于在词法解析阶段都过不去,因此也就不存在引擎去执行代码的阶段了。

 

4.code

if (1 === 1) {
    let x = 3;
    console.log(x);
}
console.log(x); // Uncaught ReferenceError: x is not defined
let a = 1;
switch (a) {
    case 1:
        let x = 2;
        break;
}
console.log(x); // Uncaught ReferenceError: x is not defined
try {
    let x = 100;
    console.log(x); // 100
    console.log(a);
} catch (e) {
    let y = 200;
    console.log(y); // 200
}
console.log(x);// Uncaught ReferenceError: x is not defined
try {
    let x = 100;
    console.log(x); // 100
    console.log(a);
} catch (e) {
    let y = 200;
    console.log(y); // 200
}
console.log(y); // Uncaught ReferenceError: y is not defined

 

从上能够看出,let存在块级做用域,var则没有。对象

 

 

再看let(var)和constblog

let x = 10;
x = 20;
console.log(x); // 20
const y = 10;
y = 20; // Uncaught TypeError: Assignment to constant variable.
console.log(y);
const obj = {a: 10};
obj.b = 20;
console.log(obj);  // {a: 10, b: 20}

 

let建立的变量是能够更改指针指向的,也就是能够从新赋值的,可是const声明的变量是不容许改变指针指向的。
ps:以前有人说const建立的是常量,常量即不可更改,但从代码示例能够看出,const声明的基本类型值确实不容许改变,但若声明的是存储对象的地址指针,仍是能够操做该对象的,像数字100这种才是真正的常量。
相关文章
相关标签/搜索