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
复制代码
这个题是来考察做用域链的,必须十分清楚怎样造成做用域链,闭包是什么造成的。咱们一步一步来分析到底每一步函数的调用,发生了什么事情。javascript
var a = fun(0);
复制代码
此时,fun(n , o)开始执行,形参n = 实参0 ,形参o 没有传入实参,因此运行console.log(o)的时候打印的是undefined,并且此时造成了一闭包,做用域上的变量的状况以下java
接下来咱们看第二步发生了什么面试
a.fun(1)
复制代码
调用以前返回的那个对象,对象里有一个闭包,就是a.fun这个函数,实际做用域链有两条了,具体分析以下图ajax
好了,到这里这个题已经结束了,由于无非就是新建做用域链和闭包做用域链之间的关系,
平时基本没接触过闭包,而且闭包里面还要调用,注意了!!!=》不是闭包的函数,很绕吧,
我认为底层发生的事情,我是说清楚了
复制代码
当时考官问了我两个关于异步的题,答的很差,回来我本身想了想,看了一些大神文章+看书叫你不知道的javascript中卷 关于e6promise的,基本解决了问题,后面准备专门写一篇关于处理异步思路的文章promise
如下是第一题的示意图
复制代码
一、按钮A按了以后,ajax请求的数据显示在input type=text框里,B按钮也是。bash
二、解决思路,设置一个状态变量,来控制ajax回调函数。 说的太抽象,举个例子,ajax发出是这个样子的:闭包
ajax(url A按钮 , callbackA按钮的回调函数),
ajax(url B按钮 , callbackB按钮的回调函数),
复制代码
在callback上咱们作一下改动,设置一个全局变量异步
var status; //值是undefined
复制代码
咱们在点击A按钮的时候, 让status的值变为A函数
status = "A";
复制代码
咱们在点击B按钮的时候,让status的值变为Bui
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的数据的问题。