转载于:

https://www.cnblogs.com/jing-tian/p/11073168.html
变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
    varTest();
    letTest();
    function varTest() {
        var x = 31;
        if (true) {
            let x = 71;  // same variable!
            console.log(x);  // 71
        }
        console.log(x);  // 71
    }

    function letTest() {
        let x = 31;
        if (true) {
            x = 71;  // different variable
            console.log(x);  // 71
        }
        console.log(x);  // 31
    }

var 具有变量提升,可以先使用后声明,let无
 
    /*1.var变量*/
    console.log(a);  //undefined
    var a=1;
    b=10; 
    console.log(b);  //10
    var b;

    /*2.let变量*/
    console.log(c); // Uncaught ReferenceError: c is not defined
    let c=2;
    console.log(d); // Uncaught ReferenceError: d is not defined
    let d;

  /*1.var变量*/

    var x = 5; // 初始化 x
    elem = document.getElementById("demo"); // 查找元素 
    elem.innerHTML = "x 为:" + x + ",y 为:" + y;           // 显示 x 和 y
    var y = 7; // 初始化 y
    var a = 10;
    console.log(window.a); //10
    console.log(this.a) //10

  /*2.let变量*/

    let b = 20;
    console.log(window.b); // undefined
    console.log(this.b) // undefined
/*不会报错,因为names1指向的地址不变,改变的只是内部数据*/ const names1 = []; names1[0] = 1; names1[1] = 2; names1[2] = 3; names1[3] = 10; console.log(names1); const names4 = [1, 4]; names4[0] = 6; names4[1] = 7; names4[2] = 8; console.log(names4);
/*出错,因为变量names2指向的地址不能发生改变,应始终指向[]所在的地址,[1,4]与[6,7]不是同一个地址*/ const names2 = [1, 4]; names2 = [6, 7]; //报错 const names3 = [1, 4]; names3[0] = 6; names3[1] = 7; console.log(names3);

   具名函数有变量提升,函数表达式不能变量提升
    const divDom = $('demo');//不会报错,具名函数自动变量提升到最前面
    console.log(divDom);
    function $(id){
        return document.getElementById(id);
    }
    
    const tableDom = _$('demo')//会报错,函数表达式不会变量提升,必须先声明后使用
    const _$ = function (id){
        return document.getElementById(id);
    }
JavaScript 只有声明的变量会提升,初始化的不会。
eg1:
var x = 5; // 初始化 x
var y = 7; // 初始化 y

elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y;           // 显示 5 7
eg2:
var x = 5; // 初始化 x

elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y;           // 显示 5 undefined

var y = 7; // 初始化 y
eg3:(效果同eg2) y 输出了 undefined,这是因为变量声明 (var y) 提升了,但是初始化(y = 7) 并不会提升,所以 y 变量是一个未定义的变量。
var x = 5; // 初始化 x
var y;     // 声明 y

elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y;           // 显示5 undefined
 y = 7; // 设置 y 为 7
 
posted on 2020-12-04 15:02  巍MG  阅读(409)  评论(0编辑  收藏  举报