DAY26: 块作用域

DAY25: 作用域三种类的种类介绍了Nodejs作用域种类,里面要提到了ES5的作用域,但其实现在的Nodejs有ES6的支持了。

因为在ECMAScript在2009年发布ES5後就没有後续动作了,
但随着Web与互联网愈发进步,ES5存在的缺陷还真不少,
像是,大部分无法支持模块化、没有局部作用域等等的问题存在,
所以ES5似乎撑不起在Web界的重责大任了。

在2015年ES6出来问世了,其中它改善了许多在ES5存在的隐患,
在模块化与作用域这个领域技术更是大大提升,
让JavaScript有更强大的支撑力。

在每个程序语言都有块作用域的概念存在,像是以C来说,
if判断语句或for回圈等语句都是独立的块作用域,会用 { }来定义。
像是

//块作用域(变量var)
if(true){
    var nicole="Hello Nicole!!";
    var pocky= 2000;
    console.log(nicole);
    console.log(pocky);
}
console.log(nicole); 
console.log(pocky);

执行结果:

https://ithelp.ithome.com.tw/upload/images/20211008/20140244Klxyqdz7ns.png

在if判断语句中定义关键字为var 的nicole与pocky,
在外部也可以被提取到,这表不仅表示if语句是块作用域也是全局作用域

但在ES5时期,不能满足这样的写法,需要用一个闭包来区隔作用域。
(更多关於闭包的参考资料:
https://zh.wikipedia.org/zh-tw/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6))

//使用闭包区隔作用域
function Closure()
{
    var nicole="Hello Nicole!!";
    var pocky= 2000;
    if(true)
    {
        (function Oh()
        {
            var nicole="GoodBye!!";
            var pocky= 10;
            console.log(nicole);
            console.log(pocky);
        }());
    }
   console.log(nicole);
   console.log(pocky);
}
Closure();

执行结果:
所以在ES5中需要通过闭包来完成块作用域,但现在不需要担心是否要写这麽冗长的程序码,
别忘罗~现在已经是ES6的世期了。

变量提升

有时会在糊里糊涂之下,会把程序顺序写反,
这时候可能就会造成错误或是找不到定义的变量或模组的情况发生。
那麽像是下面这种情况,或多或少都有发生过吧!

//变量提升
console.log(nicole);
var nicole="Love Myself";

把执行输出写在定义变量的前面了,那麽它会出现甚麽情况呢?

https://ithelp.ithome.com.tw/upload/images/20211008/20140244yhOz4YQ1iB.png

会显示undefined,但为何不是Error呢?毕竟它在还没宣告变量的时候就执行了!
但实际上这里存在一个隐藏式的变量提升,nicole变量的宣告是被提在最前面的部分。
实际上跟下面这种写法是一样的。

//不是出现Error的真相是
//上面程序码相当於下面的写法
var nicole;  //变量的关键字先被宣告
console.log(nicole);
nicole"Love Myself";

总结:

变量提升指示提升了变量的宣告,并不会提升变量的值!!!!!!!/images/emoticon/emoticon77.gif


<<:  DAY23:Service背景服务之实作

>>:  Day23 Let's ODOO: Currency

vok-orm 自订sql 查询 / db connection - day21

目标 延续前例 查询指定学期成绩,并且按平均进行排序,如下图 本范例资料表 create TABLE...

CSS基础介绍(2)

来轻松聊聊 今天的内容将着重在版面配置,利用这些属性,可以让一个网页,从完全空白到能清楚的区分网页中...

javascript(event&DOM)(DAY18)

这篇文章会介绍event和DOM,event事件的意思是说我们设计网页可以使用事件处理器(event...

[DAY 19] 验算得分的理由及注意事项

上一次讲完了回应试算表 接下来要说说验算得分的部分 为什麽要验算得分 你可能会问 将google f...

连续 30 天 玩玩看 ProtoPie - Day 11

一点开影片要继续看下去...喔喔原来昨天已经看到影片的尾巴了。 讲师跟大家讲了一下谢谢,重新的回顾这...