JS 05 - 变数宣告

大家好!

今天我们就要正式介绍变数的宣告方式了!
我们进入今天的主题吧!


宣告沿革

JavaScript 目前有 3 种宣告方式,就是昨天提到的 varconstlet
其中的 constlet 就是为了解决旧版 JavaScript 问题而诞生的宣告方式。

事实上,ES6 问世前,宣告变数一直是 var 的工作,当时也不能宣告常数,因此造成许多编写上的不便:

  1. 变数容易被污染
  2. 全域变数会被定义为 window 的属性
  3. 了解更多

宣告差异

接下来将会示范宣告方式的差异:

var

var 是基於函式来区分作用域。

var a = 0;
{
    var a = 1;
    console.log(a); // 1
}
console.log(a); // 1

a = 0a = 1 位於相同作用域,因此 a = 1 会覆盖 a = 0 的宣告。

var b = 0;
(function () {
    var b = 1;
    console.log(b); // 1
})();
console.log(b); // 0

b = 0b = 1 位於不同作用域,因为 b = 1 位於函式内。

constlet

constlet 是基於区块表示式(大括号)来区分作用域。

let c = 0;
{
    let c = 1;
    console.log(c); // 1
}
console.log(a); // 0

c = 0c = 1 位於不同作用域,因为 c = 1 位於区块内。


宣告应用

接下来会将宣告方式应用於回圈:

var

for (var i = 0; i < 2; i++) {
    setTimeout(function () {
        console.log(i);
    }, 1000);
}

// 2
// 2

怎麽会这样?不应该是出现 01 吗?
其实结果没有错,因为上方的回圈有点像是下方的情况:

{
    {
        var i = 0;
        setTimeout(function () {
            console.log(i);
        }, 1000);
    }
    {
        var i = 1;
        setTimeout(function () {
            console.log(i);
        }, 1000);
    }
    {
        var i = 2;
        /* i < 2 === false */
    }
}

当计时器内的函式执行前,i 已经更新到 2了,又因为 var 宣告的变数只会於函式区分作用域,因此所有区块的 i 将会一起更新,当然函式呼叫的 i 也只能是 2 了。

let

for (var i = 0; i < 2; i++) {
    setTimeout(function () {
        console.log(i);
    }, 1000);
}

// 0
// 1

这样就能出现我们期待的结果了!
上方的回圈有点像是下方的情况:

{
    {
        let i = 0;
        setTimeout(function () {
            console.log(i);
        }, 1000);
    }
    {
        let i = 1;
        setTimeout(function () {
            console.log(i);
        }, 1000);
    }
    {
        let i = 2;
        /* i < 2 === false */
    }
}

尽管计时器的函式是在 i 更新到 2 後才执行,但是因为 let 宣告的变数会於区块表示式区分作用域,因此每个区块的 i 都不会互相影响,也无法呼叫其他区块的 i,当然函式呼叫的 i 就是相同区块中的 i 了。


如果回圈有计数器,请记得不能使用 const

差不多也到尾声了。
如果对文章有任何疑问,欢迎於下方提问和建议!
我是 Felix,我们明天再见!


<<:  Day05 - 让轮子依随机速度转动并渐慢停下来

>>:  Day05 - this&Object Prototypes Ch3 Objects - Contents - Property Descriptors 开头

k8s prometheus 监控多个MySql -盖完後的新增

【YC的寻路青春】 上一篇已经有点太多了 容许我分两篇 不然有点爆炸 如果盖完之後 要增新的话 1....

Day.10 「没有 RWD 的网站 === 没有未来」 —— RWD 响应式网页设计

虽然标题有点耸动,但在这个行动装置越来越多的现在,如果没有手机版的网页,SEO 排名会大受影响,也...

RXDB connect to React Component

Demo /** * Sample React Native App * https://githu...

Day 27-制作购物车之Redux 2

主要呈现实作成果 以下内容有参考教学影片,底下有附网址。 (内容包括我的不专业解说分析及在实作过程中...

Day 31 | 常见 Livewire 问题: jQuery 在渲染时会打回原形

jQuery 在大多数的专案中都不可或缺,在没有 Livewire 之前要修改画面都要靠它来手动更改...