ES6
にLet
付属する変数を紹介しますblock level scoping
。ES5
がなくなるまでblock level scoping
、ブロック内で宣言された変数は常にhoisted
関数レベルのスコープになります。
基本的にScope
は、プログラム内で変数が表示される場所を指し、宣言した変数を使用できる場所を決定します。ではES5
、我々持っglobal scope,function scope and try/catch scope
て、ES6
我々はまた、レッツを使用してブロックレベルのスコープを取得します。
var
キーワードで変数を定義すると、定義された瞬間から関数全体がわかります。
let
ステートメントで変数を定義するとき、それはそれが定義されているブロックでのみ知られています。
function doSomething(arr){
//i is known here but undefined
//j is not known here
console.log(i);
console.log(j);
for(var i=0; i<arr.length; i++){
//i is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
for(let j=0; j<arr.length; j++){
//j is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
}
doSomething(["Thalaivar", "Vinoth", "Kabali", "Dinesh"]);
コードを実行すると、変数j
はでのみ認識され、loop
前後では認識されないことがわかります。それでも、私たちの変数i
はentire function
、それが定義された瞬間から知られています。
letを使用すると、新しいレキシカル環境を作成し、古い参照を保持するのではなく、新鮮な値をバインドするという、もう1つの大きな利点があります。
for(var i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
for(let i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
最初のfor
ループは常に最後の値を出力しlet
、新しいスコープを作成して新しい値をバインドしてusを出力し1, 2, 3, 4, 5
ます。
になるとconstants
、基本的にのようlet
に機能します。唯一の違いは、値を変更できないことです。定数では変更が許可されていますが、再割り当ては許可されていません。
const foo = {};
foo.bar = 42;
console.log(foo.bar); //works
const name = []
name.push("Vinoth");
console.log(name); //works
const age = 100;
age = 20; //Throws Uncaught TypeError: Assignment to constant variable.
console.log(age);
定数がを参照する場合object
、それは常にを参照しますobject
が、object
それ自体を変更できます(変更可能な場合)。イミュータブルをobject
使いたい場合は、Object.freeze([])
let foo = () => bar; let bar = 'bar'; foo();
はすべての宣言が巻き上げ効果をよりよく示していることがわかります。