变量(var,let)

每个变量声明都要加上let关键字。 解释:如果你不指定关键字let 该变量就会暴露在全局作用域(window)中,这很可能会覆盖全局作用域中的同名变量,从而引发问题(另外GC也会因此而无法有效回收内存啊),所以务必用let声明变量。

有经验的js工程师习惯使用 var 来生命变量,但小编推荐使用 let。 原因在于let不存在变量提升,模糊的写法会直接报错,能提前暴露隐藏的bug。

在这里小编简单说一下js中的var、let的关键字的作用

var的作用

1、var的作用域可以是全局范围也可以是局部范围,当在函数外用var声明变量就是全局范围,当在函数内部声明时就是局部范围,比如:

var greeter = 'hey hi';

function newFunction() {
    var hello = 'hello';
}

在这个例子中,greeter的作用域时全局的,hello是局部的。

2、var 变量可以重新声明和修改

var greeter = 'hey hi';
var greeter = 'say Hello instead';

在这个例子中greeter是被重新声明了,代码是不会出错的。

var greeter = 'hey hi';
greeter = 'say Hello instead';

而在个例子中greeter是被修改了。

3、变量的提升 变量的提升是javascript的一种机制,意为在代码执行执行之前,变量、函数声明会移至其作用域的顶部。比如:

console.log(greeter);
var greeter = 'say hello';

此代码会被解析成

var greeter;
console.log(greeter); // greeter is undefined
greeter = 'say hello';

将var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化

let的作用

1、let是块级作用域

所谓的块级作用就是{}之内的内容,因此let只能在{}之内声明变量也就是所谓的局部变量,比如

let greeting = 'say Hi';
let times = 4;

if (times > 3) {
    let hello = 'say Hello instead';
    console.log(hello); // "say Hello instead"
}
console.log(hello); // hello is not defined

我可以看到代码块(定义它的花括号)之外使用hello会返回错误。这是因为let变量是块范围的

2、let 可以被修改但是不能被重新声明

就跟var一样let声明的变量可以在其作用范围内被修改,与其不同的是,let变量无法在其作用域内被重新声明,比如

let greeting = 'say Hi';
let greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared

在这个例子中,就可以看到greeting是不可以被声明的。

let greeting = 'say Hi';
if (true) {
    let greeting = 'say Hello instead';
    console.log(greeting); // "say Hello instead"
}
console.log(greeting); // "say Hi"

在这个例子中,我们可以看到greeting的可以在其作用的范围内其作用,而不是被重新声明

3、变量的提升

它的变量提升就跟var一样,不同的是let的声明不会对变量进行初始化。

console.log(greeter);//Reference Error
var greeter = 'say hello';