成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從一道詭異的JS面試題說“作用域”與“提升”

開發(fā) 前端
有朋友問我一道面試題:一道考察“Hoisting"的面試題目,本篇就這個問題和大家一起學習探討一下!

[[392744]]

 “面試造火箭,工作擰螺絲”。面試題目之詭異,常令人匪夷所思。試看一道考察“Hoisting"的面試題目:

一、提升全局變量 var

  1. var tmp = new Date(); 
  2.  
  3. function f() { 
  4.     console.log(tmp); 
  5.     if (false) { 
  6.         var tmp = "hello"
  7.     } 
  8. f(); 

JS新手往往會以為將正常打印出日期,而實際輸出的確是`undefined`!

  1. > var tmp = new Date(); 
  2. function f() { 
  3. ...     console.log(tmp); 
  4. ...     if (false) { 
  5. .....         var tmp = "hello"
  6. .....     } 
  7. ... } 
  8. > f(); 
  9. undefined  

這是因為在函數(shù)f()的內(nèi)部,var被提升到定義域的頂部,實際執(zhí)行為:

  1. var tmp = new Date(); 
  2.  
  3. function f() { 
  4.     var tmp;// 提升到這里,將全局的tmp覆蓋了。var默認賦值為undefined 
  5.     console.log(tmp); 
  6.     if (false) { 
  7.         var tmp = "hello"
  8.     } 
  9. f(); 

也就是說var不僅提升,而且將tmp初始化賦值為undefined。

二、如何才能正常輸入日期呢?

解決方案是將global-scope的var替換為block-scope的let:

  1. var tmp = new Date(); 
  2.  
  3. function f() { 
  4.     //var tmp;// 提升到這里,將全局的tmp覆蓋了。var默認賦值為undefined 
  5.     console.log(tmp); 
  6.     if (false) { 
  7.         let tmp = "hello"
  8.     } 
  9. f(); 
  10. // 2021-04-02T10:52:30.983Z 

這是因為let定義的是local-variable.

三、TDZ臨時DeadZones

更加詭異的案例,來單獨看let:

  1. var tmp = new Date(); 
  2.  
  3. function f() { 
  4.     console.log(tmp); 
  5.     let tmp = "hello"
  6.  
  7. f(); 

你原以為將會如常打印出時間,但卻報錯tmp未定義。

  1. ReferenceError: Cannot access 'tmp' before initialization 

這是因為 tmp 被提升,其實際執(zhí)行為:

  1. var tmp = new Date(); 
  2.  
  3. function f() { 
  4.     let tmp; // 提升在這里 
  5.     console.log(tmp); 
  6.     let tmp = "hello"
  7.  
  8. f(); 

然而區(qū)別于var的是,tmp僅僅被提升,卻不會被自動賦值為undefined,因此會報錯`ReferenceError`.

該問題就是傳說中的TDZ (temporal dead zone)。解決方案也簡單,就是將所有的let或者const等全部都寫到最上面。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-03-27 10:59:45

JavaScript開發(fā)代碼

2024-10-11 17:09:27

2018-04-26 11:23:01

Linuxfork程序

2022-02-08 18:09:20

JS引擎解析器

2011-05-23 11:27:32

面試題面試java

2018-03-06 15:30:47

Java面試題

2009-08-11 10:12:07

C#算法

2023-02-04 18:24:10

SeataJava業(yè)務

2009-08-11 14:59:57

一道面試題C#算法

2021-05-31 07:55:44

smartRepeatJavaScript函數(shù)

2017-11-21 12:15:27

數(shù)據(jù)庫面試題SQL

2022-04-08 07:52:17

CSS面試題HTML

2009-08-11 15:09:44

一道面試題C#算法

2023-08-01 08:10:46

內(nèi)存緩存

2021-03-16 05:44:26

JVM面試題運行時數(shù)據(jù)

2021-10-28 11:40:58

回文鏈表面試題數(shù)據(jù)結構

2015-09-02 14:09:19

面試題程序設計

2017-03-10 09:33:16

JavaScript類型

2011-03-02 10:58:16

SQL server入門面試題

2020-11-06 09:05:18

前端web開發(fā)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av三级在线观看 | 精品视频在线免费观看 | 一级无毛片 | 久久99精品久久久久久国产越南 | 国产91一区二区三区 | 日韩国产三区 | 日本精品免费在线观看 | 中文字幕男人的天堂 | 99热精品在线 | 亚洲二区在线 | 五月婷婷色 | 高清视频一区二区三区 | 国产熟熟 | 四虎影院免费在线 | 欧美一级大黄 | 不卡视频在线 | 在线播放国产一区二区三区 | 国产精品日日摸夜夜添夜夜av | 一区二区免费视频 | 99视频入口 | 国产成人精品久久 | 色黄爽 | 九九综合 | 午夜在线免费观看 | 亚洲成人一区二区三区 | 97av视频| 欧美成人精品二区三区99精品 | 一级欧美一级日韩片 | 欧美一区二区视频 | 91在线精品视频 | 亚洲精品视频在线播放 | 中文字幕乱码一区二区三区 | 欧美涩| 九九久久久 | www精品美女久久久tv | h视频在线免费 | 日韩欧美大片在线观看 | 日韩精品一区二区三区高清免费 | www.操.com| 成人国产在线视频 | 在线日韩精品视频 |