​ 先看一题

    var name = 'Tom';
    function () {
        if(typeof name == 'undefined'){
            var name = 'jack'
            console.log('GoodBye' + name)
        }else{
            console.log('Hello'+name)
        }
    }()
    
    // GoodByejack

反复看都没有理解为什么会输出这个结果,原因是没有留意到函数内的变量提升

转化一下

    var name = 'Tom';
    var f1 = function () {
		var name
        if(typeof name == 'undefined'){
            name = 'jack'
            console.log('GoodBye' + name)
        }else{
            console.log('Hello'+name)
        }
    }
    f1()

这样看就比较清楚了,函数内变量提升,覆盖了外部的name全局变量,判断类型时,函数内变量name并未赋值,导致了上面的输出结果