JS 變數帶var與不帶var的區別

2021-10-06 23:26:17 字數 1730 閱讀 5615

1.看下列**( 帶var ):

console.

log(a)

//undefined 變數提公升 宣告時還未賦值

console.

log(window.a)

//undefined 下面檢測結果中說明window下有這個屬性 但是沒有賦值

//檢測a屬性是否在window物件中

console.

log(

'a'in window)

//true

//在變數提公升階段,在全域性作用於中宣告了乙個變數a,此時就相當於把a當做屬性賦值給window了,只是此時還未給a 賦值 預設值是undefined, 全域性變數的值修改那麼window的屬性值也會跟著修改

var a =

12;

console.

log(a)

;//全域性變數 12

console.

log(window.a)

//12 window下的乙個屬性名a

//全域性變數和window屬性存在對映機制

a =13

;console.

log(window.a)

//13

window.a=14;

console.

log(a)

//14

​ 在全域性作用域下宣告乙個變數,相當於為window物件設定了乙個屬性,變數的值就是屬性的值(私有作用域中宣告的變數與widow沒關係)

2.看下列**( 不帶var ):

console.

log(a)

;//報出乙個異常:a 沒有被定義 因為a不是乙個變數 (原則上下面的**無法繼續執行 這裡我們暫時跳過)

console.

log(window.a)

;//undefined

console.

log(

"a"in window)

;//false window屬性中不存在a這個屬性 在下面一行執行了a=12 之後window才有了a屬性

a =12

;// 等同於window.a =12 類似於document.getelementbyid=window.document.getelementbyid 省略了window

console.

log(a)

;//12

cosole.

log(window.a)

;//12

總結:

​ 帶var「變數」 是變數 ,在全域性下是全域性變數,由於全域性變數與window 物件有對映關係,所以有時候輸出全域性作用域下相關變數的值是相同的,不帶var 「變數」 本質上是乙個window物件上的屬性

補充:​ 1. var a=12, b=12;

​ 等同於 var a=12, var b=12;

​ var a=b=12;

​ 等同於 var a=12, b=12; //b是window下的屬性

2.私有作用域中帶var與不帶var的區別

​ 帶var的在私有作用域變數提公升階段,都宣告為私有變數,和外界沒有任何關。

​ 不帶var的不是私有變數,會向它的上級作用域查詢,不是則一層一層向上級作用域直到找到全域性作用域為止,這種機制被稱之為作用域鏈。在私有作用域中操作 非私有變數 是一直操作其它變數的值。

Js變數定義 fn裡 var與不var的區別

js執行時內建了乙個global物件。這個global物件跟執行環境有關。在瀏覽器執行環境中。global就是window物件。在nodejs中。global物件是global物件。當你在瀏覽器環境中,直接使用乙個未經定義的變數,例如foo 123 那麼foo這個變數自動宣告為全域性變數。變數引用自...

JS中用var宣告變數和不用var宣告變數的區別

閱前須知 作用域 分為全域性和區域性 函式會開闢自己的作用域 或 空間 或 過程級 變數宣告 變數在指令碼中的第一次出現是在宣告中。變數在第一次用到時就設定於記憶體中,便於後來在指令碼中引用。使用變數之前先進行宣告。可以使用 var 關鍵字來進行變數宣告。var count 單個宣告。var cou...

js中定義變數加var和不加var的區別

這個問題其實我在面試的時候有被問到過,當時我記得我回答的很模糊,面試官看到我好像不太清楚,又問我是不是可以不加var定義變數。正好昨天做專案的時候想到這個問題,覺得這種細節上的問題才是拉開差距的。js中定義變數有兩種情況 注意在方法外不加var定義變數需對其進行賦值,否則出現xx is not de...