摘要:函數聲明被提升時,聲明和賦值兩個步驟都會被提升,而普通變量卻只能提升聲明步驟,而不能提升賦值步驟。變量被提升過后,先對提升上來的所有對象統一執行一遍聲明步驟,然后再對變量執行一次賦值步驟。
專欄剛剛開通, 先把自己以前寫的一些沒人看的答案搬運過來填補一下空白.
變量的問題,莫過于聲明和賦值兩個步驟,而這兩個步驟是分開的。
函數聲明被提升時,聲明和賦值兩個步驟都會被提升,
而普通變量卻只能提升聲明步驟,而不能提升賦值步驟。
變量被提升過后,先對提升上來的所有對象統一執行一遍聲明步驟,
然后再對變量執行一次賦值步驟。
而執行賦值步驟時,會優先執行函數變量的賦值步驟,再執行普通變量的賦值步驟。
當你明白這三點后,一切都豁然開朗了。
首先來看一個DEMO:
(function(){ function a(){}; var a; alert(typeof a); //function })();
先提升兩個a,然后執行函數的賦值步驟,a沒有被賦值,故結果為function
再看一個:
(function(){ alert(typeof a);//function function a(){}; var a = 1; })();
先提升兩個a,再執行函數的賦值步驟,
因為在alert語句執行以前,還未執行a = 1的賦值步驟,函數不會被覆蓋,故為function
來個最有說服力的:
(function(){ var a = 1; function a(){}; alert(typeof a); //number })();
在alert語句執行之前,a = 1步驟和函數賦值步驟均已執行,
而且函數還在a = 1賦值語句之后,但是仍然輸出number,
就是因為函數的賦值步驟會先于a = 1的賦值步驟,函數被覆蓋,故輸出number。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80691.html
摘要:換句話說,在代碼執行之前,會對作用域鏈中所有變量和函數聲明先處理完先。總結一句話就是只有聲明被提升,而賦值或其他運算會留在原地。為其聲明變量隱性劫持到所在區域中。 之前一直覺會認為javascript代碼執行是由上到下一行行執行的。自從看了《你不知道的JS》后發現這個觀點并不完全正確。先來給大家舉一個書本上的的例子: var a=hello world; var a; co...
摘要:事實上,實現元編程有多種方式,從語言本身來講,可以分為兩類增強型與新的語法實現,前者的代表是反射,后者的代表為。在第二部分,我們嘗試在語言基礎上增加原生的元編程能力并介紹了該思路的實現框架。 語言的自由度 自由度這個概念在不同領域有不同的定義,我們借鑒數學中構成一個空間的維數來表達其自由度的做法,在此指的是:解決同一個問題彼此不相關的設計方法學數量。 例如,解決一個比如商品打折的問題,...
摘要:事實上,實現元編程有多種方式,從語言本身來講,可以分為兩類增強型與新的語法實現,前者的代表是反射,后者的代表為。在第二部分,我們嘗試在語言基礎上增加原生的元編程能力并介紹了該思路的實現框架。 語言的自由度 自由度這個概念在不同領域有不同的定義,我們借鑒數學中構成一個空間的維數來表達其自由度的做法,在此指的是:解決同一個問題彼此不相關的設計方法學數量。 例如,解決一個比如商品打折的問題,...
摘要:但是碰到聲明提升,這種想法就會被打破。聲明一個函數進行相應的操作,會得到函數聲明提升的結果。由此可以發現變量和函數的聲明都會被提升在其他代碼的前面執行。一個普通塊內部的函數聲明通常會被提升到所在的作用域的頂部。的創建初始化和賦值均會被提升。 Javascript聲明提升 在分析聲明提升之前,我認為有必要知道的兩點: 一、引擎查詢變量的兩種方式 引擎查詢變量的方式可以分為LHS和RHS兩...
閱讀 1261·2019-08-30 12:49
閱讀 3101·2019-08-28 18:14
閱讀 813·2019-08-26 11:38
閱讀 1669·2019-08-23 18:23
閱讀 2819·2019-08-23 17:04
閱讀 490·2019-08-23 16:52
閱讀 4001·2019-08-23 16:43
閱讀 2762·2019-08-23 16:12