let與const詳解
阿新 • • 發佈:2017-05-23
沒有 而在 不能 解析 引入 cti lar 語言 reference
在ES6中,js首次引入了塊級作用域的概念,而什麽是塊級作用域?
眾所就知,在js當中存在預解析的概念,就是變量提升。並且只存在全局作用域和私有作用域。在全局定義的變量就是全局變量,而在函數內部定義的變量稱為私有變量。而在if判斷和for循環之類的都是全局變量。
而塊級作用域,就是在一個作用域中,該變量只能在聲明後才能使用,並且該變量只在該作用域有效。
而let給js帶來了塊級作用域 那麽我們就細講一下let
1 //塊級作用域的變量只能在塊級作用域有效,否則報錯 2 { 3 var a=2; 4 let b=3; 5 } 6 console.log(a); //2 7 console.log(b);//Uncaught ReferenceError: b is not defined
1 //塊級作用域變量不能重復聲明變量 2 { 3 let a; 4 let a; 5 } 6 //會出現 Identifier ‘a‘ has already been declared
1 //塊級作用域只能在聲明賦值後才能使用 2 { 3 let a=b; //b還沒有聲明賦值 4 let b=10 5 } 6 // Uncaught ReferenceError: b is not defined
1 var arr=[]; 2 for(let i=0;i<10;i++){ 3 arr[i]=function(){ 4 return i 5 }; 6 } 7 console.log(arr[3]()); //3 如果用var的話 肯定就是10 啦
1 //在塊級作用域中 for分父級作用域與子級作用域 2 for(let i=0;i<10;i++){ 3 let i=‘123‘; 4 console.log(i); //打印10次 123 在同一塊級作用域下是不能重復聲明的 所以 ()與{} 在不同作用域5 }
那ok let就先結束了。
const是用來聲明常量的,感覺js越來與後端語言靠近
我們都知道常量的值是不允許改變的,但是我們不能簡單的理解內容不能改變,在js中,對象都是引用類型,而const在聲明一個對象常量的時候,他存儲的是這個對象的地址,只要這個地址不改變,const就不會報錯,至於在地址存儲的什麽東西,那就跟const就沒有太大關系了 比如:
1 const obj={ 2 name:‘xuwen‘ 3 } 4 obj.age=27; 5 console.log(obj);//Object {name: "xuwen", age: 27}
同樣,const聲明一個變量也給js帶來了塊級作用域,比如說塊級作用域只在作用域裏面才有效,比如塊級作用域不能重復聲明變量 ,比如作用域變量只能在聲明後才能使用這些上面都提到過就不重復了。
ok,結束const
那麽我們再說一下頂層對象的屬性
在ES6之前,頂層對象的屬性和全局變量是等價的。
頂層對象在瀏覽器中指的就是window對象 在node裏面就是global對象
1 //我們在全局作用域下 使用一個 a=10 相當於window.a=10
那麽我們現在是ES6時代了,當然是有所改變的
我們在用 let const class聲明變量的時候不再屬於頂層對象了
let a=10 window.a //undefined
至於node當中的global對象 哎,其實我也不是特別的熟悉。頂層對象的不同肯定會導致兼容性的問題的,至於如何解決,以後再說吧。
let與const詳解