电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談JavaScript 聲明提升

瀏覽:87日期:2023-10-13 17:34:05

1 引例及基本原理

在學習JavaScript聲明提升之前,我們先看下面這個例子:

console.log(a);var a=2;

運行結果會是什么?你可能會有以下的猜測:

1.報錯ReferenceError: a is not defined;

2.打印2;

3.打印undefined。

正確的結果是第三種,打印undefined。

下面讓我們來看看具體的原因。其實,對于var a=2;這條語句,JavaScript會將其視為兩個聲明:

定義聲明var a,會在編譯階段進行; 賦值聲明a=2,會留在原地等待執行階段進行。

而所謂的聲明提升:就是JavaScript會把var變量聲明和函數聲明都會被提升到各自作用域的頂部,而賦值操作并不會被提升。因此,上面的例子實際是按照這樣的流程來處理:

var a;console.log(a);a=2;

我們還需要知道,不僅僅是var變量聲明會提升,函數聲明同樣也會提升,現在來看下面這個例子

foo();function foo(){ console.log(a); var a=2;}

這個例子的運行結果為:打印undefined。這段代碼實際上會被理解為為下面的形式:

function foo(){ var a; console.log(a); a=2;}foo();

2 關于聲明提升的常見問題

2.1 函數表達式

先看一個函數表達式的例子:

console.log(foo);var foo=function(){}

上面代碼的運行結果為:打印undefined。實際上,變量標識符foo被提升了,但它的賦值操作并沒有被提升,我們可以理解為下面的形式:

var foo;console.log(foo);foo=function(){}

結論:函數聲明會被提升,但函數表達式不會被提升。

2.2 聲明的優先級

如果在同一個作用域內,存在同名的函數聲明和var變量聲明,那么會發生什么樣的情況呢?我們同樣再來看一個例子:

function a(){}var a;console.log(a);

var a;function a(){}console.log(a);

上面的兩種寫法,運行結果均為打印a(){}。也就是說,如果在同一個作用域內,存在同名的函數聲明和var變量聲明,則函數聲明的優先級更高。還有一種情況:如果同一個作用域內,存在多個同名的函數聲明。這種情況下,后面聲明的會覆蓋前面聲明的。

3 練習題

3.1 第一題

var getName = function() { console.log(1);}function getName() { console.log(2);}getName();

答案:打印1

解析:提升后的順序如下

var getName;//與函數聲明同名,故失效function getName() { console.log(2);}getName = function() {//賦值 console.log(1);};getName();

3.2 第二題

var a = 1;function b(){ a = 10; return; function a(){ console.log(a); } }b();console.log(a);

答案:打印1

解析:首先,我們需要梳理清楚聲明的提升。本題有幾個關鍵點,我們需要明白:

函數b內的a函數雖然在return之后,但它并沒有失效,它會發生聲明提升,從而提升到b函數作用域的頂部。

很多童鞋(比如我TAT)可能會錯誤地認為這題的答案是10,認為我們在最后調用了b函數,修改了全局變量a。實際上,由于函數a發生了聲明提升,導致在函數b內“遮蔽”了全局作用域中的變量a,因此,a=10;其實是將函數a重新賦值。為了進一步測驗,大家可以把a函數注釋掉,會發現此時的答案就變成了10。

注:本題還涉及到了閉包的相關知識,這一題詳細的解析請見參考資料[2],講得非常詳細。

var a;//全局變量a發生了聲明提升function b(){ function a(){//函數a發生聲明提升 console.log(a); } a = 10;//因為函數a離它最近,因此賦值給函數a return; }a = 1;//賦值給了全局變量ab();console.log(a);

4 參考資料

[1] 《你不知道的JavaScript》

[2] js中變量名與函數名重名的問題,Charles_Tian

[3] 函數聲明與變量聲明的提升機制優先級問題,一個菜鳥的奮斗史

以上就是淺談JavaScript 聲明提升的詳細內容,更多關于JavaScript 聲明提升的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 杜甫仪器官网|实验室平行反应器|升降水浴锅|台式低温循环泵 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | 禹城彩钢厂_钢结构板房_彩钢复合板-禹城泰瑞彩钢复合板加工厂 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 路斯特伺服驱动器维修,伦茨伺服驱动器维修|万骏自动化百科 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 免费网站网址收录网_海企优网站推荐平台 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 早报网| 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 升降炉_真空气氛炉_管式电阻炉厂家-山东中辰电炉有限公司 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 智能案卷柜_卷宗柜_钥匙柜_文件流转柜_装备柜_浙江福源智能科技有限公司 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 |