第一题
function fun(n,o){
console.log(n,o) // 注意了,这里是输出n和o,跟一般网上流传的面试题不一样哦
return {
fun:function(m){
console.log(n); // 注意了,这里又要输出n,跟网上流传的面试题也不一样哦,真是真正考验你能力的时候
return fun(m,n);
}
}
}
var a=fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
以上输出0 undefined 0,
1 0 0,
2 0 0,
3 0
复制代码
这个题是来考察作用域链的,必须十分清楚怎样形成作用域链,闭包是什么形成的。我们一步一步来分析到底每一步函数的调用,发生了什么事情。
var a = fun(0);
复制代码
此时,fun(n , o)开始执行,形参n = 实参0 ,形参o 没有传入实参,所以运行console.log(o)的时候打印的是undefined,而且此时形成了一闭包,作用域上的变量的情况如下
接下来我们看第二步发生了什么
a.fun(1)
复制代码
调用之前返回的那个对象,对象里有一个闭包,就是a.fun这个函数,实际作用域链有两条了,具体分析如下图
当fun(m ,n)调用完毕,就会形成上图右侧新的作用域链,而这个n用的变量却是作图fun作用域里的n(m是自己传的1) 记住,fun(m,n)调用完毕之后就消失了,所以后面的a.fun(2),也是 新建一个fun作用域,是跟上图右边是一个道理好了,到这里这个题已经结束了,因为无非就是新建作用域链和闭包作用域链之间的关系,
平时基本没接触过闭包,并且闭包里面还要调用,注意了!!!=》不是闭包的函数,很绕吧,
我认为底层发生的事情,我是说清楚了
复制代码
第二题、关于js异步的题
当时考官问了我两个关于异步的题,答的不好,回来我自己想了想,看了一些大神文章+看书叫你不知道的javascript中卷 关于e6promise的,基本解决了问题,后面准备专门写一篇关于处理异步思路的文章
以下是第一题的示意图
复制代码
1、按钮A按了之后,ajax请求的数据显示在input type=text框里,B按钮也是。
- 问题就是如果先按A,此时ajax发出去了,但是数据还没返回来, 我们等不及了,马上按B按钮,结果此时A按钮请求的数据先回来,这就尴尬了,按的b按钮,结果先显示A按钮返回的数据,怎么解决?
2、解决思路,设置一个状态变量,来控制ajax回调函数。 说的太抽象,举个例子,ajax发出是这个样子的:
ajax(url A按钮 , callbackA按钮的回调函数),
ajax(url B按钮 , callbackB按钮的回调函数),
复制代码
在callback上我们做一下改动,设置一个全局变量
var status; //值是undefined
复制代码
我们在点击A按钮的时候, 让status的值变为A
status = "A";
复制代码
我们在点击B按钮的时候,让status的值变为B
status = "B";
复制代码
也就是callabck改成这样:
if(status = "A") {
// 点击A按钮status就变为“A”,所以不会执行按钮B的回调函数
执行 callbackA() A按钮的回调函数
}else if(status = "B"){
// 点击B按钮status就变为“B”,所以不会执行按钮A的回调函数
执行 callbackB() B按钮的回调函数
}
复制代码
这样就解决了点A只显示A的数据,点B只显示B的数据的问题。