日韩无码专区无码一级三级片|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)銷解決方案
面試中關(guān)于 JavaScript 作用域的 5 個(gè)坑

在 JavaScript 中,代碼塊、函數(shù)或模塊為變量創(chuàng)建作用域。例如 if 代碼塊為變量 message 創(chuàng)建作用域:

公司主營(yíng)業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出諸城免費(fèi)做網(wǎng)站回饋大家。

  
 
 
 
  1. if (true) { 
  2.   const message = 'Hello'; 
  3.   console.log(message); // 'Hello' 
  4. console.log(message); // throws ReferenceError 

在 if 代碼塊作用域內(nèi)可以訪問 message。但是在作用域之外,該變量不可訪問。

以下是 5 種有趣的情況,其中 JavaScript 作用域的行為與你預(yù)期的不同。你可能會(huì)研究這些案例以提高對(duì)作用域的了解,或者只是為面試做準(zhǔn)備。

1. for 循環(huán)內(nèi)的 var 變量

思考以下代碼片段:

  
 
 
 
  1. const colors = ['red', 'blue', 'white']; 
  2.  
  3. for (let i = 0, var l = colors.length; i < l; i++) { 
  4.   console.log(colors[i]); // 'red', 'blue', 'white' 
  5. console.log(l); // ??? 
  6. console.log(i); // ??? 

當(dāng)你打印 l 和 i 變量時(shí)會(huì)發(fā)生什么?

答案:

console.log(l) 輸出數(shù)字 3 ,而 console.log(i) 則拋出 ReferenceError。

l 變量是使用 var 語句聲明的。你可能已經(jīng)知道,var 變量?jī)H受函數(shù)體作用域限制而并非代碼塊。

相反,變量 i 使用 let 語句聲明。因?yàn)?let 變量是塊作用域的,所以 i 僅在 for 循環(huán)作用域內(nèi)才可訪問。

修復(fù):

把 l 聲明從 var l = colors.length 改為 const l = colors.length?,F(xiàn)在變量 l 被封裝在 for 循環(huán)體內(nèi)。

2. 代碼塊中的函數(shù)聲明

在以下代碼段中:

  
 
 
 
  1. // ES2015 env 
  2.   function hello() { 
  3.     return 'Hello!'; 
  4.   } 
  5.  
  6. hello(); // ??? 

調(diào)用 hello() 會(huì)怎樣?(代碼段在 ES2015 環(huán)境中執(zhí)行)

答案:

因?yàn)榇a塊為函數(shù)聲明創(chuàng)建了作用域,所以在 ES2015 環(huán)境中調(diào)用 hello() 會(huì)引發(fā) ReferenceError: hello is not defined。

有趣的是,在 ES2015 之前的環(huán)境中,在執(zhí)行上述代碼段時(shí)不會(huì)拋出錯(cuò)誤。

3. 你可以在哪里導(dǎo)入模塊?

你可以在代碼塊中導(dǎo)入模塊嗎?

  
 
 
 
  1. if (true) { 
  2.   import { myFunc } from 'myModule'; // ??? 
  3.   myFunc(); 

答案:

上面的腳本將觸發(fā)錯(cuò)誤:'import' and 'export' may only appear at the top-level。

你只能在模塊文件的最頂級(jí)作用域(也稱為模塊作用域)中導(dǎo)入模塊。

修復(fù):

始終從模塊作用域?qū)肽K。另外一個(gè)好的做法是將 import 語句放在源文件的開頭:

  
 
 
 
  1. import { myFunc } from 'myModule'; 
  2.  
  3. if (true) { 
  4.   myFunc(); 

ES2015 的模塊系統(tǒng)是靜態(tài)的。通過分析 JavaScript 源代碼而不是執(zhí)行代碼來確定模塊的依賴關(guān)系。所以在代碼塊或函數(shù)中不能包含 import 語句,因?yàn)樗鼈兪窃谶\(yùn)行時(shí)執(zhí)行的。

4. 函數(shù)參數(shù)作用域

思考以下函數(shù):

  
 
 
 
  1. let p = 1; 
  2.  
  3. function myFunc(pp = p + 1) { 
  4.   return p; 
  5.  
  6. myFunc(); // ??? 

調(diào)用 myFunc() 會(huì)發(fā)生什么?

答案:

當(dāng)調(diào)用函數(shù) myFunc() 時(shí),將會(huì)引發(fā)錯(cuò)誤:ReferenceError: Cannot access 'p' before initialization。

發(fā)生這種情況是因?yàn)楹瘮?shù)的參數(shù)具有自己的作用域(與函數(shù)作用域分開)。參數(shù) p = p + 1 等效于 let p = p + 1。

讓我們仔細(xì)看看 p = p + 1。

首先,定義變量 p。然后 JavaScript 嘗試評(píng)估默認(rèn)值表達(dá)式 p + 1,但此時(shí)綁定 p 已經(jīng)創(chuàng)建但尚未初始化(不能訪問外部作用域的變量 let p = 1)。因此拋出一個(gè)錯(cuò)誤,即在初始化之前訪問了 p。

修復(fù):

為了解決這個(gè)問題,你可以重命名變量 let p = 1 ,也可以重命名功能參數(shù) p = p + 1。

讓我們選擇重命名函數(shù)參數(shù):

  
 
 
 
  1. let p = 1; 
  2.  
  3. function myFunc(q = p + 1) { 
  4.   return q; 
  5.  
  6. myFunc(); // => 2 

函數(shù)參數(shù)從 p 重命名為 q。當(dāng)調(diào)用 myFunc() 時(shí),未指定參數(shù),因此將參數(shù) q 初始化為默認(rèn)值 p + 1。為了評(píng)估 p +1,訪問外部作用域的變量 p:p +1 = 1 + 1 = 2。

5. 函數(shù)聲明與類聲明

以下代碼在代碼塊內(nèi)定義了一個(gè)函數(shù)和一個(gè)類:

  
 
 
 
  1. if (true) { 
  2.   function greet() { 
  3.     // function body 
  4.   } 
  5.  
  6.   class Greeter { 
  7.     // class body 
  8.   } 
  9.  
  10. greet();       // ??? 
  11. new Greeter(); // ??? 

是否可以在塊作用域之外訪問 greet 和 Greeter?(考慮 ES2015 環(huán)境)

答案:

function 和 class 聲明都是塊作用域的。所以在代碼塊作用域外調(diào)用函數(shù) greet() 和構(gòu)造函數(shù) new Greeter() 就會(huì)拋出 ReferenceError。

6. 總結(jié)

必須注意 var 變量,因?yàn)樗鼈兪呛瘮?shù)作用域的,即使是在代碼塊中定義的。

由于 ES2015 模塊系統(tǒng)是靜態(tài)的,因此你必須在模塊作用域內(nèi)使用 import 語法(以及 export)。

函數(shù)參數(shù)具有其作用域。設(shè)置默認(rèn)參數(shù)值時(shí),請(qǐng)確保默認(rèn)表達(dá)式內(nèi)的變量已經(jīng)用值初始化。

在 ES2015 運(yùn)行時(shí)環(huán)境中,函數(shù)和類聲明是塊作用域的。但是在 ES2015 之前的環(huán)境中,函數(shù)聲明僅在函數(shù)作用域內(nèi)。

希望這些陷阱能夠幫你鞏固作用域知識(shí)!


文章題目:面試中關(guān)于 JavaScript 作用域的 5 個(gè)坑
地址分享:http://m.5511xx.com/article/dhcheip.html