在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);
执行结果:
在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";
把执行输出写在定义变量的前面了,那麽它会出现甚麽情况呢?
会显示undefined,但为何不是Error呢?毕竟它在还没宣告变量的时候就执行了!
但实际上这里存在一个隐藏式的变量提升,nicole变量的宣告是被提在最前面的部分。
实际上跟下面这种写法是一样的。
//不是出现Error的真相是
//上面程序码相当於下面的写法
var nicole; //变量的关键字先被宣告
console.log(nicole);
nicole"Love Myself";
变量提升指示提升了变量的宣告,并不会提升变量的值!!!!!!!
>>: Day23 Let's ODOO: Currency
目标 延续前例 查询指定学期成绩,并且按平均进行排序,如下图 本范例资料表 create TABLE...
来轻松聊聊 今天的内容将着重在版面配置,利用这些属性,可以让一个网页,从完全空白到能清楚的区分网页中...
这篇文章会介绍event和DOM,event事件的意思是说我们设计网页可以使用事件处理器(event...
上一次讲完了回应试算表 接下来要说说验算得分的部分 为什麽要验算得分 你可能会问 将google f...
一点开影片要继续看下去...喔喔原来昨天已经看到影片的尾巴了。 讲师跟大家讲了一下谢谢,重新的回顾这...