棧記憶體:作用域
提供乙個供js**自上而下執行的環境(**都是在棧中執行的)
由於基本資料型別值比較簡單,他們都是直接在棧記憶體中開闢乙個位置,把值直接儲存進去的
當棧記憶體被銷毀,儲存的哪些基本值也都跟著銷毀了
堆記憶體:引用值對應的空間
儲存引用型別值的(物件:鍵值對 函式:**字串)
當前堆記憶體釋放銷毀,那麼這個引用至徹底沒了
堆記憶體的釋放:當堆記憶體沒有被任何的變數或者其他東西所占用,瀏覽器會在空閒的時候,自主的進行記憶體**,把所有不被占用堆的記憶體銷毀掉(谷歌瀏覽器)
*** = null 通過空物件指標null可以讓原始變數(或者其他東西)誰都不指向,那麼原有被占用的堆記憶體就沒有被東西占用,瀏覽器會銷毀他
當棧記憶體(作用域)形成,js**自上而下執行之前,
瀏覽器首先會把所有帶「var」/「function」關鍵字的進行提前的宣告或者定義
這種預先處理機制稱之為「變數提公升」
- 宣告(declare):var a / function sum (undefined)
- 定義(defined):a = 12 (定義其實就是賦值操作)
[變數提公升階段]
帶"var"的只宣告未定義
帶"function"的宣告和賦值都完成了
變數提公升只發生在當前作用域(例如:開始載入頁面的時候只對全域性作用域下的進行提公升,因為此時函式中儲存的都是字串而已)
在全域性作用域下宣告的函式或者變數是「全域性變數」,同理,在私有作用域下宣告的變數是「私有變數」 [帶var/function的才是宣告]
建立函式部分**後,直接跳過即可(因為在提公升階段就已經完成函式的賦值操作了)
console.
log(a)
;var a =
12;
在全域性作用域下宣告乙個變數,也相當於給window全域性物件設定了乙個屬性,變數的值就是屬性值(私有作用域中的宣告的私有變數和window沒啥關係)
console.
log(a)
;// undefined
console.
log(window.a)
// undefined
console.
log(
'a'in window)
// true 在變數提公升階段,在全域性作用域中宣告了乙個變數a,此時就已經把a當做屬性賦值給window了,只不過此時還沒有給a賦值,預設值undefined :in 檢查某個屬性是否隸屬於這個物件
var a =12;
// 全域性變數值修改,win的屬性值也跟著修改
console.
log(a)
;// 12
// 全域性變數和win中的屬性存在「對映機制」
// 不加var的本質是win的屬性
console.
log(a)
// vm60:1 uncaught referenceerror: a is not defined
console.
log(window.a)
// undefined
console.
log(
'a'in window)
// false
a =12
;// window.a = 12
console.
log(a)
;// 12
console.
log(window.a)
// 12
var a =12,
b =13;
// b 帶var
var a = b =12;
// b不帶var 相當於var a = 12; b = 12;
私有作用域帶var和不帶var的區別
帶var的在私有作用域變數提公升階段,都宣告為私有變數,和外界沒有任何關係
不帶var不是私有變數,會向上級作用域查詢,看是否為上級的變數,不是,繼續向上查詢,一直找到window為止(我們把這種查詢機制叫做:「作用域鏈」)也就是我們在私有作用域中操作的這個非私有變數,是一直操作別人的
前端從0單排之JS Day8筆記
陣列也是物件資料型別的,也是由鍵值對組成的 var ary 12 23,34 結構 0 12,1 23 2 34 length 3 1.以陣列作為索引 屬性名 索引從零開始遞增 2.有乙個length屬性儲存的是陣列長度 ary 0 獲取第一項 ary ary.length 1 獲取最後一項 陣列中...
前端從0單排之JS Day12筆記
math稱為數學函式,但是它屬於物件型別 typeof math object 之所以叫做數學函式,是因為math這個物件中提供了很多運算元學的方法 abs 取絕對值 math.abs 1 1 ceil floor 向上或者向下取整 math.ceil 10 10 math.ceil 10.01 1...
Python從0到1之異常
當檢測到錯誤時,直譯器無法繼續執行了,反而出現了一些錯誤提示,就是異常 try 可能發生錯誤的 except 如果出現異常執行的 try f open test.txt r except f open test.txt w try 1 0except zerodivisionerror print ...