//es3/es5
//變數提公升:當棧記憶體(作用域)形成,js**自上而下執行之前,瀏覽器首先會把所有帶var和function關鍵字的進行提前的
//宣告或定義.這種預先處理機制稱之為變數提公升。
//宣告(declare):var a或function sum
//定義(defined):a=12 也就是賦值
//變數提公升階段:
//帶var的只宣告未定義
console.log(a)//undefined
var a = 12;
function b(arr)
}//跳過後就會執行下面這個函式呼叫,傳了乙個陣列進去。
//而執行乙個函式也就是形成了乙個私有棧記憶體。當私有的作用域形成後也不是立即**執行,而是先進行變數提公升(變數提公升前,先形參賦值)
b([1,2,3,4])
//在es3和es5語法規範中,只有全域性作用域和函式執行的私有作用域(棧記憶體),其他大括號不會形成棧記憶體
//帶var與不帶var
//在全域性作用域下宣告乙個變數,也相當於給window全域性物件設定了乙個屬性,變數的值就是屬性值(私有作用域下宣告的私有變數
//和window沒有關係)
//帶function的宣告和賦值都完成了
//變數提公升至發生在當前作用域(例如:開始載入頁面的時候支隊全域性作用域下的進行提公升,因為此時函式中儲存的都是字串)
//在全域性作用域先宣告的函式或者變數是『全域性變數』,同理,在私有作用域下宣告的變數是『私有變數』[帶var和function才是宣告
console.log(i)//undefined
console.log(window.i)//
undefined
console.log('i' in window)//
true 在變數提公升階段,在全域性作用域中宣告了乙個變數i,此時就已經把i當做屬性值賦值
//給了window了,只不過此時還沒有給i賦值,預設是undefined
//in? :檢測某個屬性是否隸屬於這個物件
var i = 9//
變數值修改window的值也跟著修改
console.log(i)//
9 console.log(window.i)//
9 window的乙個屬性名為i
i=13console.log(window.i)
//13
window.i=14console.log(i)
//14 重點:全域性變數和window的屬性存在『對映機制』,就是有乙個改變另乙個也跟著改變
//不帶var 不帶var的本質是window的屬性
//console.log(j)//j is not defined 這裡的j是按照變數的來識別的
這裡是按照window的屬性來識別的,因為物件沒有某乙個屬性返回的就是undefined
不存在這個屬性
j=10//
這裡不帶var 就相當於給window加了乙個屬性叫j,值是10
console.log(j)//
10 console.log(window.a)//
12//
var q =10,
//s =11 //這樣寫s是帶var
//var q = s =11 // 這樣寫不帶var
//在私有作用域中帶var和不帶var也有區別:帶var在私有作用域變數提公升階段都宣告為私有變數和外界沒有任何關係
//不帶var 不是私有變數,它會想它的上級作用域查詢,看它是否是上級的變數,不是繼續向上查詢,一直找到window為止
//這種查詢機制叫『作用域鏈』
undefined
var n =13;
m =13;
function
fn()
fn()
console.log(a,m)
//這裡的a是全域性的所以是13,b在函式裡被重新賦值所以是14
//在私有作用域中如果向上級查詢變數到window的時候發現window也沒有這個屬性時又是怎麼做的呢?
functionf() f()
console.log(b)
//13
//只對等於號左邊進行變數提公升
fnn()//fnn is not a function
sun()//
2 var fnn = function ()
fnn()
function sun ()
sun()
//條件判斷下變數提公升
console.log(z)if(1===2)
console.log(z)
if(1===1)
}console.log(fs)
//函式本身
//es6中let建立的變數不存在變數提公升。不允許重複定義 暫時性死區
//切斷了全域性變數和window屬性的對映機制
console.log(a)//a is not defined
let a =12console.log(window.a)
//undefined
console/log(a)//12
let和var定義變數的區別
一 let不能在js中使用,是es6的語法,需要在js中使用就必須使用嚴格模式 use strict 二 宣告後未賦值,表現相同 var vartest let lettest console.log vartest 輸出undefined console.log lettest 輸出undefin...
let 和 var 的區別
1 作用域只侷限於當前 塊 if true console.log str console.log str1 str1 is not defined2 let宣告的作用於不會被提公升 console.log str var str 1 console.log str1 str1 is not def...
var和let的區別
在es6中新增了let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的 塊內有效。let let所在的區域會形成塊級作用域 let不存在變數提公升的情況 let會形成暫時性的死區 不可以在同一作用域下重複宣告變數 var 在es6之前 都是用var 宣告變數,只有函式...