记录自己面试遇到的难题及分析

第一题

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的数据的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值