SOURCE

console.log(a);//这种所谓变量提升 怎么看都是一个bug
var a=1;


//console.log(b);//使用let 就避免的了这种bug
//let b=10;

//----------------//
for(var i=0;i<10;i++){
    //do nothing
}
console.log("i : "+i);

for(let j=0;j<10;j++){
    //do nothing
}
//console.log("j : "+j);//j 此时没有定义

var a=[];
for (var i=0;i<10;i++){
    a[i]=function(){ 
        //这里a[i]保存的其实是一个地址(值) 把函数所在的指针赋给了此数组
        //可以想象到a数组 保存的都是10个相同的指针
        console.log(i)
    }
}

a[6](); //return 10

var a=[];
for (let j=0;j<10;j++){
    console.log("loop in: "+j);
    a[j]=function(){ 
        //这里a[i]保存的其实是一个地址(值) 把函数所在的指针赋给了此数组
        //可以想象到a数组 保存的都是10个相同的指针
        console.log(j)
    }
}

a[6](); //可以理解为 let 强行解决了上述这个bug.

//--------不允许重复声明--------//
function func(){
    let a=10;
    //var a=1; //不允许重复声明
}

function func1(arg){
   // let arg; //形参已经定义过了 不能在里面再定义一遍.
}

function func2(arg){
    {
        let arg; //块内部 可以声明
    }
}
//-----------块级作用域------------//
var temp=new Date();
(function f(){
    console.log(temp);
    if(false){
        var temp='hello world';
    }
})() //由于bug一样的变量提升,f函数执行前 会先定义所有变量. temp=undefine. 然后开始执行.

var s = 'hello';

for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}

console.log(i); // 5  i作为全局变量 泄露了出来.

(function f1(){
    let n=5;
    if(true){
        let n=10;
    }
    console.log(n)
})()


const PI=3.14156;
console.log(PI)
//PI=3 //TypeError: Assignment to constant variable.

//--------const 本质---------------//
const foo={};
foo.prop=123;
console.log(foo.prop);
//const 只能保证常量指针的指向的位置固定不变. 其内部的属性是管不住的.
//如果真想冻结 请使用Object.freeze方法
console 命令行工具 X clear

                    
>
console