在我们定义变量的时候都要加上像是 var
、const
、let
等关键字,
那麽他们在作用域中又代表了甚麽样的位置呢?
var
关键字代表着在全局作用域或函数作用域,都能被提取到!!
//var作用域
var nicole="Hello Nicole!!";
function Oh() {
//var b = 10;
console.log("函数作用域:"+nicole);
//console.log(b);
}
Oh();
console.log(nicole);
执行结果:
若是来一个进阶版的
//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
执行结果:
结果可以看到在外面的pocky没有被提取到!但又为甚麽呢?不是说用var就在哪里都可以被提取吗?
因为变量pocky是在函数内被定义的,像是nicole变量是属於全局变量的,
所以外部内部照样提取,但pocky是函数作用域就只能在这个区块被提取!!
const
是一个块作用域!变量被定义const时
,
代表这个变量不能
同一个区块再被宣告,同样的也不能再被修改。
假设宣告了const
的nicole变量,但又修改了nicole变量。
//const作用域
const nicole="Hello Nicole!!";
nicole="100";
执行结果:
代表已经定义const
的nicole变量不能再修改!
//重复宣告
const nicole="Hello Nicole";
const nicole="Goodbye";//Identifier 'nicole' has already been declared
执行解果:
不能再重复宣告!!!!!
但如果是定义let
的变量呢?
//const与let作用域
const nicole="Hello Nicole!!";
if(nicole)
{
let nicole="100";
console.log("函数作用域:"+nicole);
}
console.log(nicole);
执行结果:
使用let
nicole变量可以被修改且输出,而外部的也照样提取const
nicole变量,
这是因为let
也是块作用域!
但定义const
的变量不能被修改,可是定义const
修饰的对象却可以被修改!
//const作用域,修饰对象
const nicole={};
nicole.id="Hello";
nicole.name="Nicole";
console.log(nicole);
执行结果:
所以const
是看"指针"来判断一个对象是否被修改。
let
与const
一样都是块作用域,代表只能在当下的区块使用。
//let作用域
const nicole="Helllo Nicole!!";
for(let nicole=0; nicole<5 ; nicole++)
{
console.log(nicole);
}
console.log(nicole);
执行结果:
在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);
执行结果:
贴心提醒: 在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
资料型别 以下给大家介绍一些常用的资料型别,如下 : 符号 说明 False 布林值False 0 ...
什麽是 Code splitting?为什麽要做 Code splitting? 如果你的网站是用 ...
程序写了老半天,说到底就是为了处理资料。 不管处理逻辑使用了多少技术,到头来终究会得出一个结果,并且...
IAM (Identity and Access Management) 对於 AWS 上的服务安全...
昨天说到了将资料订阅出来渲染在页面上的事,那麽就就来说说 RxJs 解订阅这件事吧。 这也是为了避免...