JS-作用域
作用域
1.瀏覽器在執行js代碼的時候,會給js代碼分配一個全局對象叫window,對應的這個全局空間就叫全局作用域。
2.私有作用域
函數在執行的時候,瀏覽器會開辟一個私有空間,叫私有作用域,在私有空間下,分配一個內存模塊和一個執行模塊。聶村模塊先找出所有的var和function把變量存進去,執行模塊由上到下逐行執行,再操作不變量的時候,先問自己的私有作用域下查找是否有這個變量,有就看賦值了沒有,賦值了就直接使用,沒賦值就是undefined,如果沒有這個變量,就向該私有作用域的父級作用域查找,有就使用(看賦值了沒有,賦值了就直接使用,沒賦值就是undefined),如果沒有就向父級的父級查找,以此類推直到window,如果window下沒有就報錯(xxx is not defined)。如果有看賦值了沒有,賦值了就直接使用,沒有賦值就是undefined。這種查找機制就叫作用域鏈。
變量提升:
作用域鏈查找過程中,看一個變量是否在該作用域下存在,存在看賦值了沒有,賦值了直接使用,沒有賦值就是undefined。這種功能就是變量提升。
函數歸屬問題:
函數歸屬于哪一個作用域,跟它在哪一個作用域定義有關,跟它在哪個作用域下執行無關
函數參數問題:
function fn(a);定義函數,如果函數帶形參,就相當于內存中的儲存了一個變量a。
函數調用時:
先開辟一個私有空間,先把形參存到內存中,如果有實參,給這個變量賦值,如果沒帶就是undefined,然后再找出代碼塊中的所有var和function。然后代碼從上到下依次執行
形參帶默認值,先把形參和值一起存到內存中,帶實參調用,就相當于把值進行覆蓋
案例
function fn(a=12){//形參
console.log(a)
}
fn()
fn(23//實參)
= 賦值運算(從右往左),就相當于給變量存東西 var a=2;var b={12,56}
== 才是真正的等號
=== 恒等于,既判斷數據類型,還判斷值 a=3;b="3" a===b
備注:widnow不是js所有的,而是瀏覽器的一個對象。

浙公網安備 33010602011771號