瀏覽器如何實現變數提公升var和function

2021-10-05 12:26:09 字數 3447 閱讀 1931

var a=

10;

宣告declare:var a;

定義defined:a=10;

瀏覽器在以下js**執行之前對var關鍵字進行提前宣告

var a;   預設值是undefined,var只宣告不定義
console.

log(a)

;//=>undefined 此時瀏覽器列印undefined,而不是報錯:a is not defined

var a =12;

//=>建立值12 不需要再宣告a了(變數提公升階段已經宣告了,不會重新處理) 這一步只做了賦值操作,a=12

a =13;

//全域性變數a=13 這一步修改了全域性變數值

console.

log(a)

;//=>13

console.

log(a)

;// 報錯 =>uncaught referenceerror: a is not defined 沒有var 關鍵字不會做變數提公升

a =13

;console.

log(a)

;

function func(){}     相當於func=函式   在這個階段宣告和賦值都做了
func()

;//ok js沒有執行之前,變數提公升階段遇到function關鍵字,宣告了func,並給他賦值func=函式,所以執行func()不會報錯。

function

func()

func()

//報錯 func is not a function,不會再往下執行

varfunc

=function()

var

func

=function()

func()

//ok 只能放在函式下方執行,符合**程式設計的邏輯

把原本作為值的函式表示式匿名函式「具名化」(雖說是起了名字,但是這個名字不能在外面訪問 =>也就是不會在當前當下文中建立這個名字)

當函式執行,在形成的私有上下文中,會把這個具名化的名字做為私有上下文中的變數(值就是這個函式)來進行處理

作用:

var

func

=function

aaa();

aaa();

//=>uncaught referenceerror: aaa is not defined

func

()

settimeout

(function

func()

,1000

);

console.

log(a)

;//報錯=>uncaught referenceerror: cannot access 'a' before initialization 不能在let宣告之前使用變數

let a =12;

a =13

;console.

log(a)

;

var a =12;

console.

log(a)

;//=>12 全域性變數

console.

log(window.a)

;//=>12 對映到go上的屬性a

window.a =13;

console.

log(a)

;//=>13 對映機制是乙個修改另外乙個也會修改

//全域性上下文遇到if ,進行變數提公升,

//新版本 var a=undefined,function func=undefined

console.

log(a, func)

;//=>undefined undefinedif(

!("a"in window))}

console.

log(a)

;//=>undefined

//ec(g)變數提公升

//fn=>1

// =>2

//var fn; 已經宣告過了

// =>4

// =>5

//全域性上下文中有乙個全域性變數fn,值是輸出5的函式(此時window.fn=>5)fn(

);//=>5

functionfn(

)//=>不再處理,變數提公升階段搞過了fn(

);//=>5

functionfn(

)fn()

;//=>5

varfn

=function()

//=>var fn不用在處理了,但是賦值在變數提公升階段沒處理過,此處需要處理 fn=window.fn=>3fn(

//ec(g)變數提公升:var a;function a;

var的變數提公升和let的

es3 es5 變數提公升 當棧記憶體 作用域 形成,js 自上而下執行之前,瀏覽器首先會把所有帶var和function關鍵字的進行提前的 宣告或定義.這種預先處理機制稱之為變數提公升。宣告 declare var a或function sum 定義 defined a 12 也就是賦值 變數提公...

瀏覽器預解析之變數提公升奧秘,手動滑稽

提公升的物件包括 函式宣告 變數宣告 函式內部作用域預設形參宣告 1.函式宣告和變數宣告是同乙個變數名 當函式宣告和變數宣告衝突的時候,變數宣告無法覆蓋函式宣告,變數賦值可以覆蓋函式宣告 所以最後結果為10 具體 a a 呼叫函式 a 10 變數 var a 全域性變數 或者 var a 10 同上...

瀏覽器如何工作

吃飽沒事,隨便翻譯一篇文章。現在的瀏覽器可以做很多事,如chrome可以執行多種應用外掛程式。但我覺得你可能對如何載入展示網頁感興趣。網路是c s架構的。瀏覽器僅僅是其中的一半 客戶端 另一半是等待客戶端發請求的伺服器。首先,瀏覽器要找到web伺服器的位址。它問作業系統伺服器的名字 作業系統便查詢本...