1、js中的記憶體空間分為兩種:棧記憶體、堆記憶體
棧記憶體:提供js**執行的環境;
儲存基本資料型別的值;
全域性作用域或私有作用域都是棧記憶體。
堆記憶體:儲存引用資料型別的值 ------ 物件是把屬性名和屬性值儲存進去;
函式是把函式體中的**當做字串儲存進去。
2、當瀏覽器載入html頁面的時候,首先會提供乙個供js**執行的環境:全域性作用域(global scope)。
3、在js**執行之前,瀏覽器還需要自己做一些事情,即把所有帶 var / function 關鍵字的進行提前的宣告或定義:「預解釋」(變數提公升)
宣告(declare):告訴瀏覽器我有這樣乙個東西,例如 var abc ; function fn;
定義( defined ): 給我們宣告的變數或者函式賦值, 例如 abc = 12; fn = function()
注意:變數只宣告沒有定義,預設的值是undefined(未定義)
4、var 和 function 在預解釋階段處理是不一樣的
var:在預解釋的時候只是提前的宣告了這個變數,只有當**執行的時候才會完成賦值操作 【宣告時不賦值】
function:在預解釋的時候會提前的把宣告加定義都完成了(在**執行的時候遇到定義的**直接的跳過) 【宣告時賦值】
5、全域性變數和私有變數
在全域性作用域下宣告的變數是全域性變數
在私有作用域中宣告的變數是私有變數;
函式的形參也是私有的變數。
如何分辨函式中出現的變數是私有的還是全域性的?
首先看是否為形參,然後看是否在私有作用域中宣告過(有沒有var過),兩者有其一就是私有的變數。那麼在當前函式中不管什麼位置出現都是私有的,和全域性的沒有半毛錢關係;如果兩者都沒有,說明不是私有的,則往其上一級作用域進行查詢....
6、函式執行的時候會形成乙個新的私有作用域(棧記憶體),供函式體中的**執行;
1)給形參賦值
2)私有作用域下的預解釋
3)私有作用域下的**執行
形成的新的私有作用域還保護了裡面的私有變數不受外界的影響,我們把函式的這種保護機制稱為「閉包」。
區別:帶var的可以在**執行前進行宣告,而不帶var的不能提前的宣告
1、不管條件是否成立都要進行預解釋(undefined)
2、預解釋只發生在「=」的左邊,只把左邊的進行預解釋,右邊的是值是不進行預解釋的
匿名函式之函式表示式:把函式定義的部分當做值賦值給乙個變數或者元素的事件。
函式表示式的預解釋預設是undefined。
3、函式體中return下面的**都不在執行了,但是下面的**需要參加預解釋。
4、匿名函式的function在全域性作用域下是不進行預解釋的
匿名函式之自執行函式:定義和執行一起完成了 , 如 (function(num))(100);
5、在預解釋的時候,如果遇到名字重複了,只宣告一次,不重複的宣告,但是賦值還是要重複的進行的。
在js中變數的名字和函式的名字如果一樣算作重複的。
js預解釋的特殊情況
if num in window console.log num undefined以上例子中執行過程如下 1.預解釋 var num 2.if 條件不成立 3.console.log num undefined 匿名函式之函式表示式 把函式定義的部分當做乙個值複製給變數 某乙個事件 注意比較以下兩...
預解釋機制
in in num in window,判斷num是否為window這個物件的乙個屬性,是的話返回true,不是的話返回false var obj console.log name in obj true console.log eat in obj false1 預解釋的時候,不管條件是否成立,都...
JS學習之預解析
doctype html utf 8 js預解析 title 情況一 報錯,num未定義 情況二 坑1 console.log num undefined var num 10 由於 執行是先解析再執行 所以上面的 等價於 var num console.log num num 10 由於num在定...