《去哪儿网》前端面试总结2
阅读:11457 次 编辑日期:2014-01-24
目录:
概述:
昨天公司年会,抽中了个小马,希望马年能好运,也祝大家好运。快到春节了,大家都该回家了,我也用《去哪儿网》面试总结系列来结束今年的文章更新吧,今天继续总结问题。
上面变量对象链接的网站是国内顶级前端工程师goddyzhao的博客,里面有很多深层次的文章,我的一些文章也是参照他的文章,无论是表达能力还是翻译能力都远胜于我,希望大家仔细阅读。
如果里面的文章你都能理解了,那么找个工作对与你来说易如反掌。
面试题1:
之前废话说的有点多,开始今天的总结,看下面的代码:
if(0){
var a = 1;
}
alert(a);//undefined
答案是undefined。
首先你要理解:代码在运行之前会有一个执行上下文的过程,会把变量的值初始化为undefined。
估计有人会问了:if中的语句不会执行到啊,所以应该是not defined。
在了解执行上下文的过程之后你要了解:代码块没有自己的上下文。
所以共用一个上下文,就算不执行到if里面的语句,也会被初始化为undefined。
面试题2:
如果理解了执行上下文,看下面的代码:
var a = 2;
function auto(){
alert(a);//function a(){}
var a = 2;
function a(){};
alert(a);//2
}
auto();
答案是函数a 和 2.
有些同鞋肯定又要问了,执行函数auto之前会有执行上下文的过程,alert(a)肯定是undefined啊?
能想到是undefined的同学恭喜你已经理解了执行上下文了,但是你没能理解执行上下文中变量对象的赋值过程。
在执行上下文的过程中,会先把变量声明的值初始化为undefined,但是如果有同名的函数声明的话,函数声明会替换同名的变量声明的值。反之不成立。。
这下理解为什么第一个alert的结果会是函数a了吧,因为undefined被函数a覆盖了。
同学们要问了,照这么说第二个alert也应该是函数a了?
同学们,之前那种情况是因为alert之前没有变量,所以会执行出执行上下文的值,但是如果有变量声明了,就不是执行上下文的结果了,函数a不会覆盖变量a。