js變量提升_學習筆記:JS中的作用域和預解析

知識總結:謝靜賢、湯昊

在javascript中作用域是非常重要的,本文將會說明作用域以及我們在工作,以及面試中的一些面試題,如果有不足的地方希望大家可以評論指出來,自己一定會及時的改正錯誤,避免大家走入一些誤區。

一:作用域

二.預解析??

三.作用域鏈

四.函數和變量提升

五.預解析中的一些變態機制?

一、作用域

一般情況下,一段代碼中所用到的名字并不總是有效可用的,而限定這個名字(變量)的可用性的代碼范圍就是這個名字的作用域,可用有效的減少變量名沖突

1、js的作用域(es6)之前:全局作用域,局部作用域

2、全局作用域:整個script標簽?或者是單獨的JS文件

3、局部作用域(函數作用域),在函數內部就是局部作用域,這個變量名只能在函數內部使用

4、變量作用域

根據作用域的不同,變量分為全局變量,局部變量

?注意

如果在函數內部沒有聲明直接賦值的變量也叫全局變量?

?函數的形參也是局部變量

?全局變量:只有瀏覽器關閉的時候才會銷毀,比較占內存

?局部變量:當程序執行完畢就會銷毀,比較節約內存

5、現階段JS沒有塊級作用域

在es6中有塊級作用域

塊級作用域?{}?if{}?for{}

6、作用域鏈

內部函數訪問外部函數?采用的就是鏈式這種結果就是作用域鏈?(就近原則)

二.預解析

1、什么是預解析:

預解析:在當前作用域下,js代碼執行之前,瀏覽器會把帶有var和function關鍵字的提前進行聲明(var只聲明)或定義(function聲明并定義),并在內存中安排好。然后再從上到下執行js語句。

2、預解析的作用:

變量提升(Hoisting):在JS中,瀏覽器會把定義在后面的(變量或函數)提升到前面當前作用域的top處。也就是說在當前作用域中我們在js代碼未執行到聲明之前就可以使用了;

var和function預解析的不同

Var

var在預解釋的時候,只進行提前的聲明,只要是通過var定義的,不管變量或者函數,都是賦值undefined;

Function

function在預解釋的時候提前的聲明和定義都完成了,但是它儲存數據的空間里存儲的是字符串,沒有任何意義。

三.作用域鏈

  • JavaScript代碼中至少有一個作用域, 即全局作用域。

  • 凡是代碼中有函數,那么這個函數就構成另一個作用域。

  • 如果函數中還有函數,那么在這個作用域中就又可以誕生一個作用域。

  • 將這樣的所有的作用域列出來,可以形成的結構就稱之為作用域鏈。

  • 0596ee3ad7004bdc51b688ffd0e8cf8e.png

  • 0ff5c4a3e8e0f6e331f63d1e14e643b7.png

四. 函數和變量提升

1.? 函數提升(函數預解析):函數的聲明會被提升到當前作用域的最上面,但是不會調用函數。

2.變量提升(變量預解析):變量的聲明會被提升到當前作用域的最上面,變量的賦值不會提升。

變量提升和函數提升基本上是面試必問題目

10d0804d5e6a4b0c5cd316e340eb3593.png

下面我們針對這個例子解析一下

我們知道變量和函數定義都會提升到作用域最前邊

唯一需要確認的是變量和函數的先后順序

我們預想 函數是用會不會提升到最前邊呢?

befc1751081078283183b57fda3416d1.png

按照我們預想的解析結果應該是

// undefined // undefined // 報錯

理由 函數在上var在下,第一個console時a未賦值,其結果是undefined,if為false 只剩最后一個console也是undefined 最后a is not a function.

不過結果是

026ec99b2f3b9eb6875651d880868e4c.png

我機智的認為 預想錯了?

191395cfbb07cfa4628d799efd9a4728.png

這樣?對比一下結果人工解析結果 :1、a() 2、1 3、1 4、a() 報錯

瀏覽器執行結果:

8c7228956f40ce06358d3b34a3b2980d.png

看到這里一切完美,不過我還是重新搜索了一些高質量文章,發現我錯了,雖然執行結果是對的,不過瀏覽器和人工解析還是不一樣的,和我們最開始預想的一樣,函數優先。

既然標題說到了變量 和 函數,我們就一塊來說說

8b4203a5cbb9f473c0367c74f0efa265.png

首先上邊已經說到我們預想和認為的是錯的。

正確解析順序是這樣的

f02d8fca4aa86b2aa8ef98abb063fe19.png

但是,這個但是很重要瀏覽器執行結果是:

241af57fd27dcb74ecc648ed580dcdc8.png

why?這就要講講我所了解到的原理。

同名變量和函數,函數會提升到最前邊,變量其次,那為什么結果不是我們人工執行的undefined呢?原因是 變量會被忽略,是的是忽略。。。

305a45b1d715d14ef52acbe6dcbbc929.png

完美!

還有呢?是的還有同名變量是怎樣的順序,同名函數是怎樣的順序。

同名變量

205632786070d514c9120337b95f43b4.png

同名變量,聲明會被提升,后邊會忽略。

同名函數

419dfd23feaf23f968a64d897c868983.png

5473faaccf3aedfd3048fdde11abdc46.png

我想你已經猜到了,同名函數會被覆蓋。

五.預解析中的一些變態機制

不管條件是否成立,都要把帶var的進行提前的聲明

2a8f0bba339445202a9836fddf52a905.png

JavaScript進行預解析的時候,會忽略所有if條件,因為在ES6之前并沒有塊級作用域的概念。本例中會先將num預解析,而預解析會將該變量添加到window中,作為window的一個屬性。那么 'num' in window 就返回true,取反之后為false,這時代碼執行不會進入if塊里面,num也就沒有被賦值,最后console.log(num)輸出為undefined。

return下的代碼依然會進行預解析

b7ca1ef3dfc84bcfe851348ca164d5ac.png

函數體中return下面的代碼,雖然不再執行了,但是需要進行預解析,return中的代碼,都是我們的返回值,所以不進行預解析。

您的點贊是我繼續下去的動力,謝謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271202.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271202.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcGIS Engine開發之旅09--幾何對象和空間參考

1.Geometry Geometry 是 GIS 中使用最為廣泛的對象集之一,用戶在創建、刪除、編輯和進行地理分析的時候,就是處理一個包含幾何形體的矢量對象;除了顯示要素意外,控件對象選擇,要素符號化,標注要素&#xf…

項目管理:軟件工程相關知識筆記

1、軟件工程概念介紹軟件工程是指應用計算機科學、數學、管理科學等原理,以工程化的原則和方法來解決軟件問題的工程,其主要目的是提高軟件生產率、提高軟件質量、降低軟件成本。2、軟件工程學的組成軟件開發技術:軟件開發方法學、軟件工具、…

android開發java環境_搭建Android開發環境 - Android - mobile - JavaEye論壇

Android的開發現在是如火如荼,逞現在不是很忙了,學習了下,這里記錄下了在windows在如何搭建Android開發環境,對自己是個記錄,對新入門的兄弟姐妹們可以參考一下!(1)安裝JDK,省略。(2)下載Androi…

updatebyprimarykeyselective的where條件是全部字段_ArcGIS 字段計算器

使用鍵盤輸入值并不是編輯表中值的唯一方式。在某些情況下,為了設置字段值,可能要對單條記錄甚至是所有記錄執行數學計算。您可以對所有記錄或選中記錄執行簡單計算和高級計算。此外,還可以在屬性表中的字段上計算面積、長度、周長和其他幾何…

jQuery自定義選擇器

jQuery 1.8版本后&#xff0c; 可以通過$ 的createPseudo()方法自定義選擇器&#xff0c;滿足不同的需求&#xff0c;本文來自<jquery in action> <ul class"levels"><li data-level"1" data-points"1" data-technologies"j…

項目管理基礎:軟件生命周期概念介紹

1、軟件生命周期定義軟件產品或軟件系統要經歷孕育、誕生、成長、成熟、衰亡等階段稱為軟件的生命周期。2、軟件生命周期階段組成軟件的生命周期由可行性分析與項目開發計劃、需求分析、總體設計、詳細設計、編碼、單元測試、綜合測試、維護階段。2.1 可行性分析與項目開發計劃…

jvm棧和寄存器

jvm棧和寄存器 總結

python模型_python 模型的釋義

CharField#字符串字段, 用于較短的字符串.#CharField 要求必須有一個參數 maxlength, 用于從數據庫層和Django校驗層限制該字段所允許的最大字符數.IntegerField用于保存一個整數.FloatField# 一個浮點數. 必須 提供兩個參數:## 參數 描述# max_digits 總位數(不包括小數點和符…

java 布爾表達式_java - 布爾值,條件運算符和自動裝箱

java - 布爾值&#xff0c;條件運算符和自動裝箱為什么拋出falsepublic static void main(String[] args) throws Exception {Boolean b true ? returnsNull() : false; // NPE on this line.System.out.println(b);}public static Boolean returnsNull() {return null;}雖然…

安裝你自己的perl modules

來源&#xff1a; http://www.cnblogs.com/itech/archive/2012/12/17/2822044.html 安裝你自己的perl modules。當沒有root權限的時候&#xff0c;需要安裝perl modules到自己的home目錄下。 來自&#xff1a;http://servers.digitaldaze.com/extensions/perl/modules.html Ins…

項目管理基礎:項目的生存周期模型

1、概念介紹軟件生命周期模型是一個包含軟件產品開發、運行和維護中有關過程、活動和任務的框架&#xff0c;它覆蓋了系統從需求定義到系統使用的結束階段。特點&#xff1a;描述了開發的主要階段定義了每個階段需要完成的任務和過程規范了每個階段的輸入輸出提供了一個標準框架…

jps顯示當前所有java進程pid

很多Java命令都在jdk的JAVA_HOME/bin/目錄下面&#xff0c;jps也不例外&#xff0c;他就在bin目錄下&#xff0c;所以&#xff0c;他是java自帶的一個命令。 jps(Java Virtual Machine Process Status Tool) 是java提供的一個顯示當前所有java進程pid的命令&#xff0c;適合在…

jvm內存結構_淺談JVM內存結構

JVM 可以分為 5 個部分&#xff0c;分別是&#xff1a;類加載器&#xff08;Class Loader&#xff09;&#xff1a;加載字節碼文件到內存。運行時數據區&#xff08;Runtime Data Area&#xff09;&#xff1a;JVM 核心內存空間結構模型。執行引擎&#xff08;Execution Engine…

java annotation應用_java Annotation的應用

一、Annotation 示例Override Annotation1 Override2 public void onCreate(Bundle savedInstanceState);二、Annotation 概念及作用1 概念An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and package…

鴻蒙和安卓,到底有什么區別?

對于開發者來說兩個最關鍵的點值得關注&#xff1a;一個是 Beta 版的開發工具&#xff0c;一個是開源網站。開源網站在開發者大會上宣布將 HarmonyOS源代碼捐贈給中國開放原子開源基金會&#xff0c;并在大會上公布了鴻蒙系統的開源路線。OpenHarmony 官方源碼地址&#xff1a;…

錯題集03

(選擇一項) 3A: B: C: D: 正確答案是 B解析:LinkedList是實現List,Collection接口,是鏈表方式進行構建的,根據開發要求不同,可以使用LinkedList實現棧(先進先出)和堆(先進后出)這樣的數據結構。(選擇一項) 4A: B: C: D: 正確答案是 C解析&#xff1a;由于Hashtable是線程…

從零開始學python人工智能課程_從零開始如何學習人工智能?

想要學習人工智能&#xff1f;這里有一條完整路徑資源在本文中&#xff0c;《Analytics India》雜志給出了學習AI的最佳途徑。...科技領域的天平正在向人工智能傾斜&#xff0c;IT領域的技術人員正在將AI應用到現有產品中。但是對于企業來說&#xff0c; AI人才才是關鍵。企業培…

項目管理基礎:軟件開發的方法介紹

軟件開發方法主要有結構化方法、原型化方法、面向對象開發方法、敏捷方法。1、結構化方法結構化方法由結構化分析、結構化設計、結構化程序設計組成&#xff0c;它是一種面向數據流的開發方法。結構化分析&#xff1a;依據分解與抽象的原則&#xff0c;按照系統中數據處理的流程…

類加載器子系統的作用

類加載器子系統的作用