JavaScript中的声明提升

         js引擎运行js分为两步:  预解析 代码执行

                1. 预解析 : js引擎会把js里面所有的var 还有 function 提升到当前作用域的最前面

                2. 代码执行 :  按照代码书写的顺序从上往下执行

         预解析分为 变量预解析 (变量提升) 和 函数预解析 (函数提升)

                 1. 变量提升 就是把所有的变量声明提升到当前的作用域最前面  不提升赋值操作

                 2. 函数提升 就是把所有的函数声明提升到当前的作用域最前面  不调用函数

下面利用代码来看看变量和函数是怎样提升的:

        案例1:


console.log(num);       //  执行输出的结果是: undefined

// 上面的代码相当于:
var num;                // 变量声明提前  
console.log(num);        // 声明了一个变量num,但是没有赋值,所以输出是 undefined

//正确的变量声明如下:
var a;        // 声明一个变量a
a = 10;        // 给变量a赋值
console.log(a)    // 变量调用

        案例2:


console.log(num);       // 输出结果 :undefined
var num = 10;

// 以上代码相当于
var num ;                // 变量声明提前,定义一个变量num
console.log(num);          // 由于console.log 前面的变量num没有赋值,所以输出 :undefined
num = 10;

        案例3:

fn();        // 调用函数  注意:不调用函数,函数不会执行
function fn() {
    console.log(11);       // 结果输出 :11
}        // 这种函数声明方式,调用函数在函数声明前面或者后面都可以
        // 一般建议先声明函数后调用        常用这种方式声明函数

        案例4:

fun ();         // 输出结果 : 报错
var fun = function() {
    console.log(22);
}      
// 该函数是利用函数表达式进行声明的   调用必须写在函数表达式的下面

// 上面声明函数相当于声明一个变量来理解
console.log (a);        // 此时a变量都没有声明,输出是有错的,
var a = 3;            // 所以上面函数都没声明就开始调用是错的

        案例5: 

// var b = 9;
// var c = 9;    b 和 c 的声明提前  全局变量
function f1() {
    var a = b = c = 9;
    // 上面的代码相当于相当于 var a = 9 ; b = 9; c = 9; 
    // 正确的集体声明为 var a = 9, b = 9, c = 9;
    // 所以b 和 c 直接赋值 没有var声明 当全局变量看
    console.log(a);    // 输出 :9
    console.log(b);    // 输出 :9
    console.log(c);    // 输出 :9
}
console.log(b);   // 输出 :9  b是全局变量,所以能输出
console.log(c);   // 输出 :9  c是全局变量,所以能输出
console.log(a);   // 报错     a 在函数f1中声明,属于局部变量,全局区域无法使用变量a


版权声明:本文为weixin_45813597原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。