JavaScript 变量

变量

可以把变量想象成一个容器,是用来装东西的,比如有一个名字特别长很难记住,这时候可以把这段话存在一个变量比如叫「a」,以后在其他地方需要用到这个名字的时候就调用「a」即可。

变量的使用

把超长的名字存在一个变量里,在需要它的时候进行调用:

变量
var a = '风暴降生丹妮莉丝·坦格利安一世,不焚者,弥林女王,安达尔人、洛伊拿人和先民的女王,草海上的卡丽熙,奴隶解放者和火龙之母……';

console.log('my name is ' + a)

变量的过程

变量的过程
var a; // 首先是声明,有了 a 这么一个东西,但是并没有说 a 是什么
a = '你好'; // 通过等于号进行赋值,表明 a 的值是一个字符串内容是你好

变量的要求

  1. 不能是关键字或保留字:保留字
  2. 只能是字母、数字、_(下划线) 和 $ 组成且第一个字母必须是字母、数字、_(下划线)

var

var a = 10;
a = 20;

console.log(a); //20

上述操作 a 最后是 20,因为 var 定义的变量可以重复的赋值。

var 的坑
// 第一段代码
var a = 10;
(function () {
    var a = 20;
})();
console.log(a); // 10

// 第二段代码
var b = c = 10;
(function () {
    var b = c = 20;
})();
console.log(c); // 20

另外,如果不遵守标准不使用 var 定义变量,在非严格模式下会自动提升为全局变量,那么上述代码中的第二段代码中本来因为函数非全局作用域的关系,是不能改变到 c 变量的,但是实际情况是这样赋值的

(function () {
    var b,c;
    b = c;
    c = 20; // 此时变成了全局变量影响到了外面的 c
})();

let 和 const

let 和 const 声明变量是为了解决提升问题,提升是浏览器解析 JavaScript 的结果。本质上,在执行任何 JavaScript 代码之前,所有变量都会被「提升」,也就是提升到函数作用域的顶部。

function getClothing(isCold) {
 if (isCold) {
   var freezing = '加件衣服吧';
 } else {
   var hot = '今天蛮热的';
   console.log(freezing);
 }
}
getClothing(false);// undefined

为什么是 undefined 呢?因为在 var 的声明变量下,不是全局作用域就是本地作用域(也就是整个函数作用域),那么在上述例子中 freezing 和 hot 一开始在顶部声明了但是没有进行赋值,传入 false 后 if 判断走了 else 但是因为没有对 freezing 赋值所以结果是 undefined。

function getClothing(isCold) {
    var freezing;
    var hot;
    if (isCold) {
        freezing = '加件衣服吧';
    } else {
        hot = '今天蛮热的';
        console.log(freezing);
    }
}
getClothing(false);// undefined

而 let 和 const 的声明的作用域是到块,如果在代码块(用花括号 { } 表示)中使用 let 或 const 声明变量,那么该变量会陷入暂时性死区,直到该变量的声明被处理。这种行为会阻止变量被访问,除非它们被声明了。

function getClothing(isCold) {
 if (isCold) {
   let freezing = '加件衣服吧';
 } else {
   let hot = '今天蛮热的';
   console.log(freezing);
 }
}
getClothing(false);// Uncaught SyntaxError: Unexpected identifier

因为是块级作用域所以函数声明是在 if 的代码块 {} 内声明,所以根本找不到 freezing。

关于 let 和 const

  • 使用 let 声明的变量可以重新赋值,但是不能在同一作用域内重新声明。
  • 使用 const 声明的变量必须赋初始值,但是不能在同一作用域内重新声明,也无法重新赋值。

最大的问题是何时应该使用 let 和 const?一般法则如下:

  • 当你打算为变量重新赋值时,使用 let,以及
  • 当你不打算为变量重新赋值时,使用 const。

因为 const 是声明变量最严格的方式,我们建议始终使用 const 声明变量,因为这样代码更容易读懂,你知道标识符在程序的整个生命周期内都不会改变。如果你发现你需要更新变量或更改变量,则回去将其从 const 切换成 let。

很简单吧?但是 var 呢?var 该怎么办?

还有必要使用 var 吗?没有了。

在某些情况下有必要使用 var,例如如果你想全局定义变量,但是这种做法通常都不合理,应该避免。从现在开始,建议放弃使用 var,改为使用 let 和 const。

Conners Hua

欢迎加入群聊: Telegram 群聊 | QQ 群聊(不讨论敏感话题)

您可能还喜欢...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.