在面试过程中我相信很多人可能遇到过这样的情况,面试官给出几道题,来看这输出什么,那输出什么,往往很多同学就在这里跪了。 今天就总结一下这个问题: 先来一波题

var x = 5;
a();
function a() {
    alert(x);
    var x = 10;
}
alert(x);
---------------------------------------------------------------------------------
a()
function a() {
    alert(x);
    var x = 10;
}
alert(x);
---------------------------------------------------------------------------------
var x = 5;
function a(n) {
    alert(x);
}
a();

这时候很多对js执行顺序不是很清楚的朋友是不是开始懵逼 这里先引用一下 _LARK作者的文章总结的一大堆内容 https://www.cnblogs.com/lark-/p/7954047.html, 这里 _LARK作者总结的很详细,大家可以先了解一下,后面我自己分享一下自己的总结,如果作者看到不允许转载请联系我,我马上删除 1、预处理阶段

a、读取分析整个源代码

b、先扫描函数声明,之后扫描变量(var声明)

    b_a、处理函数声明时有冲突,会覆盖

    b_b、处理变量声明时有冲突,会忽略

c、将扫描到的函数和变量保存到一个对象中(全局的保存到window对象中)

d、变量的值是undefined,函数的值则指向该函数(是一个函数字符串)

       形式如下:{a : undefined, f : 'function(){alert(a);var a = 5;}'}

2、运行阶段

在我们刚刚的案例中

a、将变量a的值从undefined改为5

b、调用f(),一遍函数得到执行

上面函数代码的处理过程:

1、预处理阶段

    a、将函数的参数添加到一个对象(词法对象)

    b、扫描函数声明,之后扫描变量(var声明)

    d、将扫描到的函数和方法添加到词法对象里面

    c、变量的值是undefined,函数的值则指向该函数(与全局的一样)

2、运行阶段

    与全局的的运行原理一样

现在我针对上面_LARK作者的总结说一下我自己的总结,

运行:上来先找 var 和 function 这里没有赋值等操作
执行:给变量赋值、执行函数 、优先执行等号右边的
碰到函数在内部在执行上面操作:运行、执行

然后做一下上面的几道题

var x = 5;
a();
function a() {
    alert(x);
    var x = 10;
}
alert(x);

上来先找 var 和 function 只声明不赋值,
我们找到 var x   function a()
开始执行 x = 5;
执行函数a 开始重新执行上面步骤,把他看成一个整体 var x  没有赋值
执行 alert(x) x//undefined  下一行x = 10
然后出来
alert(x) // 5    因为上面var x = 5 执行完毕

a()
function a() {
    alert(x);
    var x = 10;
}
alert(x);

运行 上来先找 var function   var 没找到不管
执行 函数a
在函数a内部:运行 var x  执行 先碰到alert(x) //x undefined
            往下执行 x = 10;
跳出函数a
alert(x) 上面没找到var x 所以 // undefined


var x = 5;
function a(n) {
    alert(x);
}
a();

这个题目很关键,和第一题认真比较一下

运行 上来先找 var function   var x; function a() {}
执行 x = 5; 放到全局
调到函数a中,alert(x) 先找x,找到了全局的x,函数内没有再声明x,所以使用全局的x
输出5