日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
從一道詭異的JS面試題說“作用域”與“提升”

 “面試造火箭,工作擰螺絲”。面試題目之詭異,常令人匪夷所思。試看一道考察“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新手往往會(huì)以為將正常打印出日期,而實(shí)際輸出的確是`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  

這是因?yàn)樵诤瘮?shù)f()的內(nèi)部,var被提升到定義域的頂部,實(shí)際執(zhí)行為:

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

這是因?yàn)閘et定義的是local-variable.

三、TDZ臨時(shí)DeadZones

更加詭異的案例,來單獨(dú)看let:

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

你原以為將會(huì)如常打印出時(shí)間,但卻報(bào)錯(cuò)tmp未定義。

 
 
 
  1. ReferenceError: Cannot access 'tmp' before initialization 

這是因?yàn)?tmp 被提升,其實(shí)際執(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僅僅被提升,卻不會(huì)被自動(dòng)賦值為undefined,因此會(huì)報(bào)錯(cuò)`ReferenceError`.

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


網(wǎng)站名稱:從一道詭異的JS面試題說“作用域”與“提升”
文章路徑:http://m.5511xx.com/article/cdgpcgh.html