JavaScript中的var、let和const

ⅰ亾dé卋堺 提交于 2020-03-18 21:56:53

3 月,跳不动了?>>>

使用var可以定义局部变量。

function myFunc() {
    var message = "Hello";
    var name = "John", 
        email = "john@somewhere.com";
}

在执行程序时,ECMAScript自动将var变量移动到当前作用域的前面,这个机制叫做声明提升(declaration hoisting)。比如下面的代码:

function myFunc() {
    console.log(message);
    var message = "Hello";
}

在执行时被修改为:

function myFunc() {
    var message;
    console.log(message);
    message = "Hello";
}

因此不会抛出ReferenceError。

 

另一个定义变量的方法是使用let。let和var的用法相似,区别在于作用域、重复声明、变量提升、全局可见性、循环可见性等方面。

let变量的作用域是当前块(block scoped),var变量则是当前函数(function scoped):

function funcA(n) {
    if (n > 0) {
        var message = "positive";
    } else {
        var message = "non-positive";
    }

    console.log(message); // ok
}

function funcB(n) {
    if (n > 0) {
        let message = "positive";
    } else {
        let message = "non-positive";
    }

    console.log(message); // ReferenceError
}

重复声明var变量是合法的,重复声明let变量不行。在同一个域中分别用var和let声明同名变量也是不允许的:

var x;
var x; // ok

let y;
let y; // SyntaxError: Identifier 'y' has already been declared

var变量会自动提升,let变量不会:

function func1() {
    console.log(message); // ReferenceError: Cannot access 'message' before initialization
    let message = "Hello";
}

如果在全局上下文(global context)中生命,var变量会自动成为window对象的属性,let变量不会:

// global context
var name = 'John';
console.log(window.name);

let age = 18;
console.log(window.age); // undefined

var或let的一个重要区别是,在for循环中,迭代控制变量必须是let。虽然从语法上来说可以用var,但这未必是你想要的结果。

for (var i = 1; i < 5; i++) {
    console.log(i);                        // 1 2 3 4
    setTimeout(() => console.log(i), 0);   // 5 5 5 5
}
console.log(i);                            // 5


for (let j = 1; j < 5; j++) {
    console.log(j);                        // 1 2 3 4
    setTimeout(() => console.log(j), 0);   // 1 2 3 4
}
console.log(j);                            // undefined

const是let的常量版本。使用const时必须对变量进行初始化,而且const变量不能被再次赋值。这里要注意的是,const保持引用不变,不能被二次赋值,但const引用的对象,其属性是可以修改的。

const name = "John";
const name = "Alice"; // SyntaxError

const user = {};
user.name = "John"; // ok
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!