JS的變數與函式

2022-07-26 17:54:11 字數 1002 閱讀 3000

變數:var a;  //定義變數a

var a = 123;  //定義變數a,並且賦值為123

js中的變數是若型別的,變數占用固定記憶體空間,因此是直接量

函式:function fn (傳參)    //宣告函式fn(「定義式函式」,即函式宣告)

var a = function(傳參) ;  //先定義變數a與乙個匿名函式,並將匿名函式賦值給變數a(賦值式,即函式表示式)

變數的定義指明了變數的作用域

函式的定義指明了函式的作用域,同時定義了函式體結構

在頁面載入的時候,瀏覽器載入js檔案並掃瞄**,此過程中,函式宣告與變數定義會被預處理,即提公升至其作用域頂部先進行宣告,對於函式,宣告了函式名與函式體,對於變數宣告了變數名,並不賦值。因此,定義式函式可在其函式**前被呼叫,而函式表示式不行,變數在這種情況下為undefined。

這種預解析也稱函式宣告提公升與變數提公升,此時後定義的變數無法覆蓋同名函式的定義。

上面介紹了函式宣告與變數宣告都指明了作用域,js的作用域按函式來劃分,在js中沒有所謂的塊作用域,即for,if,which,switch等流程控制語句是沒有限定作用域的作用的。在函式中由var定義的變數為區域性變數,只在該函式內生效,函式中的函式也為該作用域中的函式,函式外無法直接呼叫,可以通過return間接與外部溝通,這裡就涉及了閉包的知識。可以將作用域比做房間,而全域性環境比做房子,函式在執行時,先使用自己房子內的資源,當搜尋不到相關資源時,才開房門到外層空間去搜尋,直至找到並返回資源,若直至跑到客廳(全域性)去找資源,依舊找不到,則報錯,若是在此過程中找到變數但未賦值,則返回undefined。同時對兄弟房間的搜尋是不允許的。

這樣的一層一層作用域相連,形成作用域鏈。

瀏覽器在對js預解析後,開始由上到下執行js,賦值操作是在順序執行時進行賦值的,後賦值的會覆蓋先賦值的,此時與函式同名的變數賦值會覆蓋原有的函式定義。對於乙個變數值的確定需要沿著作用域鏈依照就近原則去確定。注意,未用var定義就直接賦值的變數預設為全域性變數。

JS 函式與變數

1 what?指的是變數和函式的可訪問範圍,作用域分為兩類 函式作用域和全域性作用域 1 函式作用域 只在定義的函式內允許訪問變數和函式 2 全域性作用域 一經定義,在任何位置處都能訪問 2 函式作用域中的變數 在某個函式中宣告的變數,就是函式作用域中變數,也可以稱為 區域性變數 3 全域性作用域中...

JS 變數提公升與函式提公升

在 es6 出來之前,沒有塊級作用域,只有全域性作用域 和 函式作用域。變數提公升指的是 將變數宣告提公升到它所在作用域的最開始部分。例子 console.log foo undefined var foo 變數提公升 console.log foo 變數提公升 相當於 var foo consol...

js中變數提公升與函式變數重名

var a 1 function b b console.log a 輸出結果為1 進行變數提公升之後的 var a function b a 10 return a 1 b console.log a 在函式b中先通過function關鍵字宣告了乙個a函式,相當於 var a function 這...