js全局的解析与执行过程

先看下面实例的执行结果:

alert(a);//undefined
alert(b);//报错
alert(f);//输出f函数字符串
alert(g);//undefined
var a = 1; var b = 2; alert(b);//2 function f(){ console.log('ff'); } var g = function { console.log('gg'); } alert(g);//输出g函数字符串

为什么出现这种情况,就要明白js解析和执行过程

js解析与执行过程:先预处理再执行
预处理:
1 创建词法对象(也可叫环境对象,环境上下文,上下文对象,这里只用于理解,标准中分的更细),全局环境下(浏览器)可理解是window对象
2 扫描用声明方式创建的函数和var定义的变量
3 将扫描到的变量和函数词法对象里面去:变量undefined,函数是引用
预处理后,出现如下结果:

window{
    a:undefined;
    b:
    f:指向函数;
}

执行阶段:

1 会把变量的值和非声明方式创建的函数和变量添加进去

window{
    a:1;
    b:2;
    f:指向函数;
    g:指向函数;
}

这样就解释了上面实例的结果了,上面的是预处理,下面是执行了

 另外:js预处理对命名冲突的处理

1 处理函数声明冲突会覆盖
2 处理变量声明会忽略

原文地址:https://www.cnblogs.com/by-dxm/p/6529533.html