最近更新
阅读排行
读过本文章的之后读了
关注本站

《去哪儿网》前端面试总结2

阅读:11583 次   编辑日期:2014-01-24

目录:

概述:

昨天公司年会,抽中了个小马,希望马年能好运,也祝大家好运。快到春节了,大家都该回家了,我也用《去哪儿网》面试总结系列来结束今年的文章更新吧,今天继续总结问题。
今天的问题需要理解JS的JavaScript 执行上下文 (execution contexts)
上面变量对象链接的网站是国内顶级前端工程师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
将本篇文章分享到:
top