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

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

開發 前端
有朋友問我一道面試題:一道考察“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  

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

  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 被提升,其實際執行為:

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

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

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

 

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

2024-10-11 17:09:27

2021-03-27 10:59:45

JavaScript開發代碼

2018-04-26 11:23:01

Linuxfork程序

2011-05-23 11:27:32

面試題面試java

2022-02-08 18:09:20

JS引擎解析器

2018-03-06 15:30:47

Java面試題

2009-08-11 10:12:07

C#算法

2023-02-04 18:24:10

SeataJava業務

2009-08-11 14:59:57

一道面試題C#算法

2021-05-31 07:55:44

smartRepeatJavaScript函數

2017-11-21 12:15:27

數據庫面試題SQL

2022-04-08 07:52:17

CSS面試題HTML

2009-08-11 15:09:44

一道面試題C#算法

2023-08-01 08:10:46

內存緩存

2021-03-16 05:44:26

JVM面試題運行時數據

2021-10-28 11:40:58

回文鏈表面試題數據結構

2020-11-06 09:05:18

前端web開發

2015-09-02 14:09:19

面試題程序設計

2017-03-10 09:33:16

JavaScript類型

2011-03-02 10:58:16

SQL server入門面試題
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产乱码久久久久久88av | 精品一区久久 | www.久久久.com | 中文字幕一区二区三区在线视频 | 欧美不卡一区 | 亚洲精品一区二区冲田杏梨 | 欧美一级在线 | 日韩免费视频一区二区 | 久久69精品久久久久久久电影好 | 欧美精品一区在线 | 成年人在线 | 欧美日韩在线成人 | 日本黄色影片在线观看 | 天天干夜夜拍 | 精品国产乱码久久久 | 色综合天天综合网国产成人网 | 国产ts人妖系列高潮 | 91亚洲国产成人精品一区二三 | 欧美乱人伦视频 | 日韩中文一区二区三区 | 免费国产视频在线观看 | 黄色免费观看网站 | 日韩在线观看一区 | 日本视频在线播放 | 国产欧美一区二区在线观看 | 国产91精品久久久久久久网曝门 | 91精品国产一区二区在线观看 | 日韩一区二区三区在线观看 | 免费精品在线视频 | 国产精品一区二区免费 | 日本网站免费观看 | 久草资源在线视频 | 成人黄色电影免费 | 国产中文字幕在线 | 亚洲国产精品成人 | 亚洲欧美日韩精品久久亚洲区 | 国产精品久久久爽爽爽麻豆色哟哟 | 成人国产精品久久 | 免费观看av网站 | 欧美一区二区 | 51ⅴ精品国产91久久久久久 |