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

面試中關于 JavaScript 作用域的 5 個坑

開發 前端
以下是 5 種有趣的情況,其中 JavaScript 作用域的行為與你預期的不同。你可能會研究這些案例以提高對作用域的了解,或者只是為面試做準備。

在 JavaScript 中,代碼塊、函數或模塊為變量創建作用域。例如 if 代碼塊為變量 message 創建作用域:

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

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

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

1. for 循環內的 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); // ??? 

當你打印 l 和 i 變量時會發生什么?

答案:

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

l 變量是使用 var 語句聲明的。你可能已經知道,var 變量僅受函數體作用域限制而并非代碼塊。

相反,變量 i 使用 let 語句聲明。因為 let 變量是塊作用域的,所以 i 僅在 for 循環作用域內才可訪問。

修復:

把 l 聲明從 var l = colors.length 改為 const l = colors.length。現在變量 l 被封裝在 for 循環體內。

2. 代碼塊中的函數聲明

在以下代碼段中:

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

調用 hello() 會怎樣?(代碼段在 ES2015 環境中執行)

答案:

因為代碼塊為函數聲明創建了作用域,所以在 ES2015 環境中調用 hello() 會引發 ReferenceError: hello is not defined。

有趣的是,在 ES2015 之前的環境中,在執行上述代碼段時不會拋出錯誤。

3. 你可以在哪里導入模塊?

你可以在代碼塊中導入模塊嗎?

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

答案:

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

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

修復:

始終從模塊作用域導入模塊。另外一個好的做法是將 import 語句放在源文件的開頭:

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

ES2015 的模塊系統是靜態的。通過分析 JavaScript 源代碼而不是執行代碼來確定模塊的依賴關系。所以在代碼塊或函數中不能包含 import 語句,因為它們是在運行時執行的。

4. 函數參數作用域

思考以下函數:

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

調用 myFunc() 會發生什么?

答案:

當調用函數 myFunc() 時,將會引發錯誤:ReferenceError: Cannot access 'p' before initialization。

發生這種情況是因為函數的參數具有自己的作用域(與函數作用域分開)。參數 p = p + 1 等效于 let p = p + 1。

讓我們仔細看看 p = p + 1。

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

修復:

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

讓我們選擇重命名函數參數:

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

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

5. 函數聲明與類聲明

以下代碼在代碼塊內定義了一個函數和一個類:

  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 環境)

答案:

function 和 class 聲明都是塊作用域的。所以在代碼塊作用域外調用函數 greet() 和構造函數 new Greeter() 就會拋出 ReferenceError。

6. 總結

必須注意 var 變量,因為它們是函數作用域的,即使是在代碼塊中定義的。

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

函數參數具有其作用域。設置默認參數值時,請確保默認表達式內的變量已經用值初始化。

在 ES2015 運行時環境中,函數和類聲明是塊作用域的。但是在 ES2015 之前的環境中,函數聲明僅在函數作用域內。

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

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2015-11-26 13:11:24

javascript原型鏈作用域

2011-05-12 18:26:08

Javascript作用域

2021-03-09 08:50:58

JavaScript前端作用域

2019-03-13 08:00:00

JavaScript作用域前端

2011-09-06 09:56:24

JavaScript

2011-04-18 09:31:35

JavaScript

2021-03-16 22:25:06

作用域鏈作用域JavaScript

2021-03-17 08:39:24

作用域作用域鏈JavaScript

2010-09-01 09:10:30

DHCP作用域

2010-09-27 13:21:02

DHCP作用域

2013-09-05 10:07:34

javaScript變量

2017-09-14 13:55:57

JavaScript

2015-07-21 13:39:58

Javascript作用域

2020-03-24 08:32:24

vue作用域前端

2016-12-19 11:10:32

JavaScript變量作用域

2021-12-06 07:15:48

Javascript作用域閉包

2011-03-18 09:27:00

Spring

2019-12-03 19:09:19

JavaScriptNumbers阿里云計算

2020-07-19 15:32:13

JavaScript開發技術

2020-07-29 07:52:41

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 小早川怜子xxxxaⅴ在线 | 日韩中文电影 | 亚洲成人精品 | 好好的日在线视频 | 99久久久久久久久 | 国产视频一区二区三区四区五区 | 欧美日韩国产中文 | 欧美激情久久久 | 99re视频在线免费观看 | 伊人狠狠干 | 亚洲国产精品一区 | 国产成人精品一区二区三区网站观看 | 成人欧美一区二区三区色青冈 | 精品国产乱码久久久久久闺蜜 | 狠狠婷婷综合久久久久久妖精 | 午夜视频在线观看一区二区 | 精品福利一区二区三区 | 偷拍自拍第一页 | 欧美在线观看一区 | 免费a网站 | 五月天天丁香婷婷在线中 | 黄色网址在线免费播放 | 日本午夜免费福利视频 | 国产亚洲一区二区精品 | 亚洲成人精品一区二区 | 中文字幕一区在线观看视频 | 成人欧美一区二区三区视频xxx | 国产四区 | 欧美在线一区二区三区 | 波多野结衣一区二区三区在线观看 | 国产精品久久久久久婷婷天堂 | 黄色在线观看 | 欧美a在线 | 在线播放中文字幕 | 99亚洲精品 | 午夜精品一区二区三区在线观看 | 国产一区二区精品在线 | 久久精品国产亚洲一区二区三区 | 99久久中文字幕三级久久日本 | 欧美亚洲视频在线观看 | 欧美日韩在线一区二区三区 |