JS 之 預解釋

2021-07-31 12:01:37 字數 1628 閱讀 3192

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在定...