一、声明变量

1.var 
    var + 变量名
    (1)函数体外声明的变量--全局变量

    (2)函数体内定义的变量--局部变量

    (3)没有var,直接声明变量,会进行隐式声明全局。

    (4)window对象声明全局
    function f1(){
        window.x=5
    }
    alert(x)//5
    (5)显示与隐式全局变量区别
    var v1="a"
    v2="b"
    window.v4="d";
    (function(){
        v3="c"
    })()
    console.log(delete v1);//false  var定义的全局变量不能被删除
    console.log(delete v2);//true       没经过var定义的全局变量,无论函数体内或体外都可被删除
    console.log(delete v3);//true 
    console.log(delete v4);//true 
**2.变量提升
       (1) 将变量提升到函数的top位置,只能提升变量的声明,不能提升变量的赋值
        如果函数内部要访问全局,采用window.x或window['x']
            x=1
            function f1(){
            //预编译
            //var x;
            alert(x) //undefined
            var x=2
            alert(x)//2
            alert(window.x)//1
            }
        f1()


        (2)x=1;
            (function(g){
                alert(x)//undefined
                alert(g.x)//1
                var x=2
            }(window))

        (3)变量提升--全局作用域
            预编译--变量提升
             for(var i=0;i<3;i++){
                console.log(i,m,k);
                for(var m=0;m<3;m++){
                var k=m+1
                }
            console.log(k);
            }


             for(var i=0;i<3;i++){
                console.log(i,m,k);//报错
                for(var m=0;m<3;m++){
                    k=m+1 //k为隐式全局变量,没有变量提升
                }
                console.log(k);
            }
        (4)异步情况下变量传递
            for(var i=0;i<3;i++){
                setTimeout(function(){
                    console.log(i)
                },100)
            }  // 3 3 3异步调用,循环已结束
            解决:立即执行函数
                for(var i=0;i<3;i++){
                    setTimeout((function(m){
                        return function(){console.log(m)}
                    })(i),100)
                }//0 1 2

二、作用域

1.ES5--函数作用域

2.ES5--全局作用域

3.ES6--新增     块级作用域
    {} if和for中的{}都属于块级作用域
    (1)
    {
        var a=1
        console.log(a)
    }
    (2)
    // if(true){
    //     var a=2
    // }
    // console.log(a);//2
    (3)
    for(var i=0;i<4;i++){
        var d=10
    }
    console.log(i);//4
    console.log(d);//10

三、setTimeout与setInterval

setTimeout()  方法用于在指定的毫秒数后调用函数或计算表达式
            setTimeout(function(){
                 alert("Hello"); 
                 }, 3000);

setInterval() :间歇调用,每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。
               setInterval(function(){ 
                alert("Hello"); 
                }, 3000);
只不过setTimeout执行一次,而setInterval可以执行多次,
两个函数的参数也相同,第一个参数是要执行的code或句柄,第二个是延迟的毫秒数。

四、var let const区别

var 对函数作用域有效,对块级作用域无效
    允许一个变量声明多次
    var可以变量提升
    声明的变量会成为window对象的属性    window.a
    for循环中的迭代变量(var i),var声明会渗透到循环体外

let 对函数作用域和块级作用域都有效
    不允许出现冗余声明(不允许一个变量声明多次)
    没有变量提升(暂时性死区)
    声明的变量不会成为window对象的属性
    for循环中的迭代变量(let i),let声明不会渗透到循环体外

const 定义常量
    不允许修改
            ---特殊:const定义的引用类型仅保证指针不发生改变,内容允许被修改
    在块级作用域、函数作用域都有效
    不允许重复定义变量