DAY27: var、const、let 在作用域上有甚麽不一样?

在我们定义变量的时候都要加上像是 varconstlet等关键字,
那麽他们在作用域中又代表了甚麽样的位置呢?

Var

var关键字代表着在全局作用域或函数作用域,都能被提取到!!

//var作用域
var nicole="Hello Nicole!!";
function Oh() {
    //var b = 10;
    console.log("函数作用域:"+nicole);
    //console.log(b);
}
Oh();
console.log(nicole);

执行结果:
https://ithelp.ithome.com.tw/upload/images/20211009/20140244IlaNiKuLXL.png

若是来一个进阶版的

//var作用域(函数内)
var nicole="Hello Nicole!!";
function Oh() {
    var  pocky= 10;
    console.log("函数作用域:"+nicole);
    console.log("函数作用域:"+pocky);
}
Oh();
console.log(nicole);
console.log(pocky);

先思考一下会出现甚麽结果?

为了不让整个进程因为某个潜在错误发生,而导致整个进程退出,
看不到哪些变量有被提取到,所以我在函数Oh前面放入一个监听器监听error事件,
可以参考Day20: EventEmitter中有提到相关内容。
完整程序码:

var nicole="Hello Nicole!!";
process.on("uncaughtException",(err,data)=>
{
    console.log(err);
});
function Oh() {
    var pocky= 10;
    console.log("函数作用域:"+nicole);
    console.log("函数作用域:"+pocky);
}
Oh();
console.log(nicole);
console.log(pocky); //pocky is not defined

执行结果:

https://ithelp.ithome.com.tw/upload/images/20211009/20140244VJ7Tf1qBZP.png

结果可以看到在外面的pocky没有被提取到!但又为甚麽呢?不是说用var就在哪里都可以被提取吗?
因为变量pocky是在函数内被定义的,像是nicole变量是属於全局变量的,
所以外部内部照样提取,但pocky是函数作用域就只能在这个区块被提取!!

Const

const是一个块作用域!变量被定义const时
代表这个变量不能同一个区块再被宣告,同样的也不能再被修改。
假设宣告了const的nicole变量,但又修改了nicole变量。

//const作用域
const nicole="Hello Nicole!!";
nicole="100";

执行结果:

https://ithelp.ithome.com.tw/upload/images/20211009/20140244iedM1n0LMp.png

代表已经定义const的nicole变量不能再修改!

//重复宣告
const nicole="Hello Nicole";
const nicole="Goodbye";//Identifier 'nicole' has already been declared

执行解果:

https://ithelp.ithome.com.tw/upload/images/20211009/20140244CkIzgp3utd.png

不能再重复宣告!!!!!

但如果是定义let的变量呢?

//const与let作用域
const nicole="Hello Nicole!!";
if(nicole)
{
    let nicole="100";
    console.log("函数作用域:"+nicole);
}
console.log(nicole);

执行结果:

https://ithelp.ithome.com.tw/upload/images/20211009/20140244CR4EqmTG3A.png

使用let nicole变量可以被修改且输出,而外部的也照样提取const nicole变量,
这是因为let也是块作用域!
但定义const的变量不能被修改,可是定义const修饰的对象却可以被修改!

//const作用域,修饰对象
const nicole={};
nicole.id="Hello";
nicole.name="Nicole";
console.log(nicole);

执行结果:

https://ithelp.ithome.com.tw/upload/images/20211009/20140244ijk5vMCgDB.png

所以const是看"指针"来判断一个对象是否被修改。

Let

letconst一样都是块作用域,代表只能在当下的区块使用。

//let作用域
const nicole="Helllo Nicole!!";
for(let nicole=0; nicole<5 ; nicole++)
{
    console.log(nicole);
}
console.log(nicole);

执行结果:

https://ithelp.ithome.com.tw/upload/images/20211009/20140244E0hJK1vPvP.png

在for循环中定义let nicole变量,就只能使用於这个去块下,
与外部定义的const nicole变量互不影响。

let不同的块作用域也没有被限制!!

//let不同块作用域
let nicole="Hello Nicole";
function Oh()
{
    let nicole="GoodBye";
    for(let nicole=0; nicole<5; nicole++)
    {
        console.log("for回圈:"+nicole);
    }
    console.log("函数:"+nicole);
}
Oh();
console.log(nicole);

执行结果:

https://ithelp.ithome.com.tw/upload/images/20211009/20140244R56hacWEwr.png

贴心提醒: 在const中就算是在不同的区块也会被限制喔!!

总结:

到今天为止算是把作用域的部分缕清楚了,原本以为定义变量用哪一个关键字都无所谓,
反正都会被执行,但显然是我太菜了点…,若是写到上面这些有分区块的项目时,我应该会被程序踢出去,
哈哈哈! 现在才知道这些关键字的作用域,也不算太迟,
真的好好的纪录学习下来,在写程序时才不会犯这种有点无知的错误…。

参考资料:
参考书 李锴 着<新时期的Node.js入门>
可参考资料:
这网站也详细了解说各种不同关键字在Nodejs中的作用域(内容为英文):
https://javadeveloperzone.com/nodejs/difference-between-var-let-and-const-in-nodejs/#:~:text=Nodejs%20var%20with%20examples%20Before%20the%20introduction%20of,in%20a%20function%20or%20from%20anywhere%20in%20code


<<:  Vue-cli专案介绍

>>:  [Day30] 动画篇7

[Day_2] Python 资料型别与变数

资料型别 以下给大家介绍一些常用的资料型别,如下 : 符号 说明 False 布林值False 0 ...

[铁人赛 Day05] React 中的 Code splitting(代码分离)方法

什麽是 Code splitting?为什麽要做 Code splitting? 如果你的网站是用 ...

Day28:阿赖耶识

程序写了老半天,说到底就是为了处理资料。 不管处理逻辑使用了多少技术,到头来终究会得出一个结果,并且...

[DAY 02] IAM

IAM (Identity and Access Management) 对於 AWS 上的服务安全...

Angular RxJs 各种解订阅方式

昨天说到了将资料订阅出来渲染在页面上的事,那麽就就来说说 RxJs 解订阅这件事吧。 这也是为了避免...