Javascript 結束示例

| | | | | | | | | | | | | | | | | | | | | | | | |

JavaScript 中最大的密碼之一是關閉。他是 FAANG 公司工作面試中許多問題的主題。在本文中,我們將討論柵欄和目標,用簡單的示例說明概念,然後以採訪最大的科技巨頭之一的示例問題結束。

當有人告訴你某事是或不是項目的一部分時,這是什麼意思?

我想想想潛望鏡或望遠鏡當我想到這個問題的答案時。這些工具向我們展示了他所擁有的鏡頭範圍內的各種事物:他在領域中。如果它超出範圍,您將無法看到鏡頭的直徑。並且不可能照亮直徑之外的東西。當我們討論 JavaScript 中三種非常重要且不同類型的範圍時,您應該考慮這一點:本地、全局和詞法範圍。

本地範圍

本地範圍是最小的我們今天要討論的三個範圍。當我們聲明一個函數時,任何用方括號 ({}) 括起來的東西都被認為是該函數的局部變量。當 JavaScript 引擎讀取函數時,它會聲明變量;當它結束時,它會銷毀變量。

可以看到,當“console.log()”調用greeting函數的結果時,我們可以訪問到WebsiteName之後發揮了作用。這為我們提供了我們正在尋找的“Hello Karma Career”通道。如前所述,函數中聲明的變量的 console.log () 會生成錯誤,因為它無法定義.

,WebsiteName未定義的原因是因為變量在調用時在函數內部創建,然後在執行終端指令時銷毀。函數外部的任何東西都無法訪問函數內部的東西,除非它具有特定的配置。

全局範圍

下一個字段幾乎是該短語的字面翻譯。全局範圍採用在函數外部聲明的元素並將它們保留在空格中所有腳本、方法和函數都可以訪問它們並將它們用於自己的邏輯。

如果console.log()在代碼的末尾計數,上面的代碼會做什麼?你希望會發生什麼?

我們來看代碼:.

  1. 變量計數器在全局環境中聲明並啟動
  2. 添加了在全局環境中聲明的函數。
  3. 調用添加。
  4. 在語言環境中聲明並啟動的計數器變量.
  5. 本地計數器增加 1 ‚áê 因為本地而不是全局?
  6. 返回計數器。函數結束。
  7. 再次調用添加
  8. 執行步驟 4 到 6。
  9. 再次重複步驟 3 6.a
  10. console.log (counter), ‚áê 返回什麼?

由於每當計數器為 1 時函數就結束,我們的本地計數器變量再次聲明並每次執行函數時從 0 重新開始。無論發生什麼,計數器總是在本地停止在 1。

如果一個函數在其範圍內找到一個變量,它不會尋找該變量的全局範圍 - 所以全局變量永遠不會改變。然後我們的 console.log () 將生成 0,因為我們在該指令環境中最接近定義的變量是在全局環境中。

詞法範圍

詞法作用域是 JavaScript 的基本概念之一。它的想法是,函數或變量的創建將可以被代碼的某些部分訪問,因此不能被代碼的其他部分訪問。這一切都取決於每個變量和函數的聲明在哪裡。

我們來看看這段代碼:

這裡我們有一組嵌套函數。 init()函數聲明一個變量var1,聲明一個函數second,調用second()

當編譯器第一次檢查這段代碼時,它會在高層次上檢查我們所擁有的:

此時我們在 init() 中看不到任何其他內容 - 我們僅在調用 init() 函數時才知道該函數存在,編譯器對函數內部進行了另一個高級查看:

  1. var1.
  2. seconds ()
  3. second () 調用

init ()seconds () 塊內部發生的事情一無所知。它只能看到詞法環境 - 周圍的狀態有什麼。

每個嵌套的函數都駐留在 dna 較小的容器中,例如一組嵌套的俄羅斯套娃(見頂部例如,如果您不確定 wh他們是)。她身上的玩偶知道他們的容器內發生了什麼,以及父母已經發生了什麼或已經/讀到了什麼。例如,較大的娃娃只知道下一個娃娃存在於其容器中。她不知道集合中的任何其他玩偶,只知道她的詞彙環境(她的狀態)和已經發生的事情(外部領域)。

實際上我們知道兩件事:。

  1. 外域看不到內域
  2. 內域可以訪問外域。

既然外域看不到什麼裡面正在發生,我們可以肯定地說這是一種單向關係。內部可以看到和使用外部的變量,但外部無法看到內部。這稱為 詞法終結性

詞法作用域的美妙之處在於變量的值由其在代碼中的位置決定.函數首先在其語言環境中查找變量的含義——如果找不到,它會轉到定義該函數的函數。如果它在那裡找不到它,它會沿著鏈向上到下一個定義的函數。

這正在成為 JavaScript 中一個非常重要的概念,隨著您了解更多,它會一次又一次地出現關於 JavaScript 框架及其工作原理。你可以從外面走,但你永遠不能“向上”走另一條路。當涉及到所討論的主要主題時,這一點非常重要: 結束

Closure

閉包的定義和詞法作用域很相似,兩者的主要區別在於閉包是一個高階函數,詞法範圍不是。高階函數有一個基本特徵:它返回一個函數或使用函數作為參數。

閉包是一個可以到達其詞法範圍的函數,甚至

閉包和詞法作用域都有自己的變量,可以訪問父函數的變量和參數,並且可以使用全局變量。使用以下代碼:

  1. Greeting() 函數存在,但我們還不知道內容。
  2. greetUser 存在,但我還不知道它的內容
  3. greetUser () - 這一行調用了上一行,而上一行又調用了問候語 ( ) 函數。
  4. userName declare
  5. welcomeGreeting() 存在,但我還不知道內容
  6. Return 語句welcomeGreeting() 塊下返回相同的函數
  7. console.log(`Hello,` + username) ;我們這裡的console.log可以訪問父作用域獲取userName的值
  8. 聲明終止函數並破壞代碼塊中變量含義的終端。

在這段代碼中,我們通過嵌套函數來傳遞信息,以便我們以後可以訪問父母的垃圾



結論

在本文中,我們討論了一個相當重要的 JavaScript 主題:作用域和閉包。我建議擴展並閱讀有關該主題的幾篇文章。教授這種方法的方式可以來自不同的角度——當然,這意味著有很多學習方法。我希望這本字母書對您有用!祝您繼續研究閉包好運!