一道阿里巴巴web前端面试题拓展
2014-04-18 17:04
399 查看
第二第三个问题由第一个拓展而来,先看问题吧:
第一问:
第二问:
第三问:
这三个问题涉及到了setTimeout的工作原理,执行环境与作用域还有函数的创建与调用。
首先先说一下setTimeout(function(),ms)函数,现在在我们的js文件中有这么一段代码:setTimeout( a() , 5000 );。
在执行流执行到setTimeout代码时,并不会原地踏步地等待执行完毕后再向下执行,而是会告诉浏览器,我这段代码要等待5秒之后再执行,然后立即向下执行接下来的代码。
现在可以先解决第一问了。
首先定义了一个局部变量a,并且a=6 。然后执行流遇到了setTimeout(),告诉浏览器,我1秒之后再执行这段代码,此时a仍然为6。然后跳过setTimeout()中的代码继续向下执行,就碰到了a=66,将a赋值为66 。一秒过去了之后,浏览器开始调用setTimeout()函数中的匿名函数,遇到了alert(a),在此之前匿名函数中并没有创造局部变量a,所以随着作用域链由内向外搜寻有没有变量a。当搜寻到外部函数的作用域时,发现a已经被赋值成了66,则返回结果,最终弹出窗口显示66。
第二问中,由于在setTimeout()的匿名函数中拥有了一个局部变量a,所以最后alert(a)输出的是666,这一个没什么可说的。
至于第三问的解答,涉及到了一个函数的创建与执行的区别,让我想起了C和C++中的函数创建执行部分(更多的是本人的猜想,未经求证),在进入setTimeout()函数之后,我们得先创建一个函数,然后才能执行它,在创建函数的时候,会搜寻函数内部是否有变量创建出来了。所以,当执行流遇到alert(a)的时候,开始搜寻当前环境下有没有a变量,最终发现了一个a变量,但是在未执行var a=666之前,a并没有被赋值,所以alert(a)的最终结果为undefined。
关于更多的执行环境与作用域的知识,在《JavaScript高级编程》一书中有比较详尽的说明。
这三个问题涉及到了setTimeout的工作原理,执行环境与作用域还有函数的创建与调用。
第一问:
var a = 6; setTimeout(function () { alert(a); //输出66 a = 666;}, 1000); a = 66;
第二问:
var a = 6; setTimeout(function () { var a = 666; alert(a); // 输出666, }, 1000); a = 66;
第三问:
var a = 6; setTimeout(function () { alert(a); // 输出undefined, var a=666; }, 1000); a = 66;
这三个问题涉及到了setTimeout的工作原理,执行环境与作用域还有函数的创建与调用。
首先先说一下setTimeout(function(),ms)函数,现在在我们的js文件中有这么一段代码:setTimeout( a() , 5000 );。
在执行流执行到setTimeout代码时,并不会原地踏步地等待执行完毕后再向下执行,而是会告诉浏览器,我这段代码要等待5秒之后再执行,然后立即向下执行接下来的代码。
现在可以先解决第一问了。
首先定义了一个局部变量a,并且a=6 。然后执行流遇到了setTimeout(),告诉浏览器,我1秒之后再执行这段代码,此时a仍然为6。然后跳过setTimeout()中的代码继续向下执行,就碰到了a=66,将a赋值为66 。一秒过去了之后,浏览器开始调用setTimeout()函数中的匿名函数,遇到了alert(a),在此之前匿名函数中并没有创造局部变量a,所以随着作用域链由内向外搜寻有没有变量a。当搜寻到外部函数的作用域时,发现a已经被赋值成了66,则返回结果,最终弹出窗口显示66。
第二问中,由于在setTimeout()的匿名函数中拥有了一个局部变量a,所以最后alert(a)输出的是666,这一个没什么可说的。
至于第三问的解答,涉及到了一个函数的创建与执行的区别,让我想起了C和C++中的函数创建执行部分(更多的是本人的猜想,未经求证),在进入setTimeout()函数之后,我们得先创建一个函数,然后才能执行它,在创建函数的时候,会搜寻函数内部是否有变量创建出来了。所以,当执行流遇到alert(a)的时候,开始搜寻当前环境下有没有a变量,最终发现了一个a变量,但是在未执行var a=666之前,a并没有被赋值,所以alert(a)的最终结果为undefined。
关于更多的执行环境与作用域的知识,在《JavaScript高级编程》一书中有比较详尽的说明。
这三个问题涉及到了setTimeout的工作原理,执行环境与作用域还有函数的创建与调用。
相关文章推荐
- 阿里巴巴Web前端面试的一道JS题目,求解答!!!
- 一道Web前端面试题 DIV放大
- 一道常被人轻视的web前端常见面试题(JS)
- 一道常被人轻视的web前端常见面试题(JS)
- 【JS每日练习】阿里巴巴web前端开发面试题
- 阿里巴巴Web前端开发面试题赋答案
- [面试题] 2010~2011年度搜狐、腾讯、网易、淘宝、阿里巴巴、百度等多家名企Web前端开发面试题!
- 一道常被人轻视的web前端常见面试题(JS)
- 阿里巴巴Web前端开发面试题赋答案
- web前端一道很“坑”的js面试题
- 一道网易web前端校招面试题的问题?
- Web前端面试题(前端开发人员必备)
- 携程旅游网的一道前端开发面试题
- 自己总结的web前端的jquery面试题
- 亲历腾讯WEB前端开发三轮面试经历及面试题
- Web前端开发面试题——将字符串转成驼峰写法
- web前端一些面试题1
- 昨晚阿里巴巴的一道面试题分析
- web前端面试题及答案
- Web前端开发面试题总结