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