面试题

一、请问一下代码输出结果

function fun(n, o) {
            console.log(o);
            return {
                fun: function(m) { //[2]
                    return fun(m, n); //[1]
                }
            }
        }

        var a = fun(0);
        a.fun(1);
        a.fun(2);
        a.fun(3);
        var b = fun(0).fun(1).fun(2).fun(3);
        var c = fun(0).fun(1);
        c.fun(2);
        c.fun(3);
此题考点是闭包
在函数声明定义阶段,匿名函数进行定义声明时,发现需要引用一个名为fun的函数对象,那么首先在当前函数体内寻找,发现没有,那么就到其外层函数-这个匿名函数的包裹函数中去查找,发现也没有,到外层函数中去,发现外面没有函数包裹了,那就到全局环境下去找,当找到时,就把fun函数指定为全局环境下的fun函数为对象并加入到匿名函数的闭包中去,所以JS在词法分析结束后,确定了1个闭包,就是返回的对象fun属性对应的匿名函数的闭包-访问全局环境下的func及其外层函数的函数内部变量n;
在每次func执行的时候,都会将闭包中变量的作用域信息传递到函数执行环境中,供函数执行时获取变量值时使用
var a=_fun_(0);//undefined
a.fun(1);//0
a.fun(2);//0
a.fun(3);//0

fun函数执行,因为第2个参数未定义,输出undefined。然后返回一个对象,带有fun属性,指向一个函数对象-带有闭包,能够访问到_fun_和变量n_a.fun(1)执行返回的对象的fun方法,
传入m的值1,调用返回_fun_(1,0)所以输出为0,a.fun(2),a.fun(3)和a.fun(1)

var c=fun(0).fun(1);//undefined,0,

c.fun(2);//1
c.fun(3); //1
 
二、如何从浏览器的URL中获取查询字符串参数?
  • 首先设置一个函数,给这个函数传递一个参数,也就是url的search部分的key值;
  • 设置一个正则表达式,以&开头或没有,中间是参数,后面以#或&结尾或没有;
  • 通过window.location.search.substr(1).match()匹配,返回一个数组
  • 如果数组不为空,返回数组的第3个值,也就是正则表达式的第二个子串

三、如果用户持续点击一个按钮,如何只提交一次请求,且不影响后续使用?(考点:如何使用节流)

何为节流 触发函数事件后,短时间间隔内无法连续调用,只有上一次函数执行后,过了规定的时间间隔,才能进行下一次的函数调用,一般用于http请求。

解决原理 对处理函数进行延时操作,若设定的延时到来之前,再次触发事件,则清除上一次的延时操作定时器,重新定时。

 
四、问了节流,那就绝对会问防抖,二者配合使用

何为防抖 多次触发事件后,事件处理函数只执行一次,并且是在触发操作结束时执行,一般用于scroll事件。

解决原理 对处理函数进行延时操作,若设定的延时到来之前再次触发事件,则清除上一次的延时操作定时器,重新定时。

五、下面代码的输出是什么?

第一个是3个3; 第二个是0-3,不包括3

因为第一个for循环中的i在执行定时器时就执行完毕了,由于循环中的变量i是var关键字声明的,所以它是全局变量,而此时的i为3,所以调用定时器时,i已被赋值为3了

第二个循环中,因为使用了let来声明变量,它和count声明的变量有一个特性就是自带的块作用域,在每次迭代时,i被创建为一个新值,并且每个值都会被保存在自己的作用于中

原文地址:https://www.cnblogs.com/zycs/p/13995862.html