存在形式:匿名函式 function定義的 函式儲存過程:開闢一個堆記憶體,把函式當做‘字串’儲存起來。 形參是定義的時候編寫的 實參是執行的時候傳遞的 arguments是實參的集合,也叫類陣列(類陣列包括 元素集合和arguments) return:1.決定函式的返回值2.打斷函式的執行 this: 函式的主體 var a =10,b=20;相當於var a=10;var b=20; var c=d=20;相當於var c =20;d=20;d沒有變數提升
變數提升
原理:程式碼執行之前,js會把程式碼中帶var 和帶 function的變數提前宣告
var:只宣告不定義 預設值是undefined
function:既宣告又定義
js的執行機制
變數提升對於條件語句來說,不管是否成立,都會進行變數提升
在條件語句或者迴圈語句中的大括號包著的function宣告,高版本瀏覽器只宣告不定義
變數提升只提升=左邊的,return後邊的也不提升
let和const不存在變數提升,但是有暫時性死迴圈:就是在宣告之前不能呼叫
想用他們宣告的變數 要在下邊使用 :就是先宣告在使用
作用域
let const var 三者之間的區別
1.var可以重複宣告,生命的變數存在提升,宣告的變數會在window下增加一個對應的屬性。
而let 和const都不可以重複宣告,不存在變數提升,不會在window下增加屬性。但是let和const可以識別塊級作用域
2.作用域:就是一塊棧記憶體
堆記憶體:儲存引用型別
棧記憶體:儲存值型別(私有作用域),也提供程式碼的執行環境
全域性作用域:頁面一開啟的時候就會形成一個全域性作用域,一根頁面只有一個全域性作用域
私有作用域:函式執行的時候就會形成私有作用域
塊級作用域:判斷語句、迴圈語句、大括號包起來的部分:let、const可以識別:在這裡邊宣告的function只宣告不定義。
上級作用域:(只有私有作用域才有)函式執行的那個私有作用域,一般都會存在一個上級作用域:上級作用域是誰?跟函式在哪執行麼有關係,只跟函式在哪個作用域定義有關。
函式執行:先有形參賦值,再有變數提升。
作用域鏈:私有作用域的變數有可能不是該私有作用域的私有變數,這時該變數對應的取值,先在自己的作用域查詢,如果找不到就需要去上一級的作用域查詢,還找不到,就去window找,扔找不到就會報錯。(私有作用域沒有形參也沒有私有變數,這時就往上級作用域查詢)
上述的作用域鏈這種機制就是
函式執行的過程:先開闢一個私有作用域(棧記憶體),然後形參賦值,變數提升,程式碼從上到下執行。
全域性變數:全域性作用域宣告的變數
私有變數:私有作用域宣告的變數(形參也是私有變數)
如果一個函式有形參也有實參:實參就是全域性定義的值