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...