变量提升理解

一道常见面试题,涉及变量作用域问题
var name="Bob";
(function(){
    if(typeof name=== 'undefined'){
        name='Jack';
        console.log('Goodbye'+name);
    }else{
        console.log('hello'+name);
    }
})();  //立即执行函数
请问执行后打印出的值是:(A)     
    A. Hello Bob
    B. Goodbye Jack
    C. Hello Jack
    D. Goodbye Bob
解释:name为全局定义变量且被赋值,进入else

稍微修改下
var name="Bob";
(function(){
    if(typeof name=== 'undefined'){
        var name='Jack';//此处增加name声明
        console.log('Goodbye'+name);
    }else{
        console.log('hello'+name);
    }
})();  // D
解释: 变量提升,相当于在if判断之前定义name(与外层name不同,属于函数内局部变量) 但在if 中给name 赋值,如下:
    var name="Bob";
     (function(){
            var name;
            if(typeof name=== 'undefined'){
                name='Jack';
                console.log('Goodbye'+name);
            }else{
                console.log('hello'+name);
            }
        })();// Goodbye Jack

再次修改   
    (function(){
           name='Jack';
           if(typeof name=== 'undefined'){
                console.log('Goodbye'+name);
            }else{
                console.log('hello'+name);
            }
    })(); // hello Jack
    console.log("name:"+name);// name:Jack (未使用var,默认声明为全局变量)

变量提升:函数及变量的声明都将被提升到函数的最顶部;变量可以在使用后声明,也就是变量可以先使用再声明。(变量赋值不会提升,有多个函数声明的时候,是由最后面的函数声明来替代前面的;函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之上)

你可能感兴趣的:(变量提升理解)