看到有朋友在滴滴的面试题
var kit = 1;
function fac(){
kit = 10;
return;
function kit(){};
}
fac();
console.log(kit); // 输出是什么
这里考的是函数变量提升的问题,在js预编译阶段时会将当前作用域内的var声明和函数声明提升至当前作用域顶部,并将var声明的变量初始化为undefined,而在执行阶段会从上而下按顺序执行。
关于Event loop事件循环这里不讲
JavaScript 的并发模型基于“事件循环”。
也就是说在 fac 函数内部执行时 kit 的函数声明已经提升至函数内部作用域的顶部,执行时 kit 赋值实际上是将 fac 函数作用域内的 kit 函数赋值为10,并没有修改外部声明的 kit 变量。在外面执行完 fac 函数之后输出 kit 的变量值是没有修改过的,所以输出仍旧是1。
这里补充一个题目
let i = 1;
(function(){
console.log(i);
return;
var i = 0;
function i(){}
})();
// 你觉得会输出什么呢