js面试题

本文深入探讨JavaScript中的闭包概念,解释其如何延长变量生命周期并实现私有作用域。同时,介绍了防抖和节流技术在处理高频事件中的应用,以优化性能。此外,还讨论了null与undefined的区别,并展示了ES6中filter方法的使用。最后,通过示例展示了如何使用递归实现1到100的求和。
摘要由CSDN通过智能技术生成

一。js闭包

1.闭包什么? 

简单来说就是方法里返回一个方法

闭包会常驻内容 =>慎用闭包

1.1全局变量:因为这个是全局变量,保存在全局作用域属性Script里面。会污染其他局部变量,不会被垃圾回收机制回收。代码执行完之后依然在。

1.2局部变量:因为这个是局部变量,保存在全局作用域属性Local(喽氪儿)里面。

js执行机制:会生存临时的变量对象AO OA存储所有方法和局部变量,全局不在,方法执行完后,局部变量回事,访问不到局部变量。

1.3 作用域:就近原则

1.4 延长变量的生命周期

2.闭包存在的意义

保证了每个函数(组件)都有私有作用域,也就是私有环境,能保存各自的独立性。面向对象编程--数据的隐藏和封装。

二、JS防抖节流

1.1防抖==>固定事件内,事件只允许发生一次。

函数防抖

输入完2秒钟之后才发起请求

//防抖
let telInput = document.querySelector('input');
telInput.addEventListener('input', antiShake(demo,2000));


//防抖封装  fn方法 wait等待时间
function antiShake(fn,wait){
        //定时器 初始状态是null
        let timeOut = null;
        return args => {
            //如果有先销毁掉这个操作
            if(timeOut) clearTimeout(timeOut)
            //如果没有 创建一个定时器 
            timeOut = setTimeout(fn, wait);
        }
    }

    function demo(){
            console.log('发起请求');
        }

2.1节流 => 一定时间内的多个事件合为一个

1.1应用场景 => 1.提交表单 2.高频监听事件。


let box = document.querySelector(".box");
box.addEventListener("touchmove", throttle(demo,2000));

//封装节流函数  
function throttle(event, time){
    //定时器 默认状态空
    let timer = null;
    return function(){
            //如果没有定时器 做一个定时器 event执行方法 time执行时间
            if(!timer){
                 timer = setTimeout(()=>{
                    event();
                    //制空
                    timer = null;
                },time);
                }
        }
}

function demo(){
        console.log('发送请求');
    }

 

三、null和undefined的区别

1.1  null  表示为“无”是一个对象  0  打印为obj

        null几种情况:手动释放内存 let obj{}    obj = null;

                                作为函数的参数(此参数不是对象)

                                原型链的顶端

 1.2  undefined表示“无”的原始值  打印为NaN

         undefined几种情况:已经声明未赋值  默认声明

                                            对象某个属性不存在

                                             函数调用少参数

                                              函数的返回值默认值  

四.ES6 --filter 

let a = [1,2,3,32,13];
// current => 当前值, index => 当前值的下标, array 这个数组的对象
let b = a.filter((current, index, array) => {
        returan current <10
})

console.log(a);
//小于10的 返回一个数组
console.log(b);

 

五.foreachmap的区别

1.1 foreach :没有返回值

                        不能使用break打断

                        遍历的是value值

                        不能用于对数组进行修改 ,因为没有返回值

let arr = ['a','b','c'];
let res = arr.forEach(element => {
          console.log(element);
          return elemnt + '1';
    })
    
    console.log(res);

1.2 map:有返回值(数据)默认return是undefined

                接受的参数是一个函数(key, value)

                不能用break打断

        

let arr = ['a','b','c'];
let res = arr.map((value, key) => {
          return elemnt + '1';
    })
    
    console.log(res);

六.js递归求和1-100

//1 + 2 + 3
function add(num1,num2){
        let num = num1+ num2
        if(num2 +1 >100){
            return num;
        }else{
            return add(num,num2 + 1)
        }
    }

let sum = add(1,2);
console.log(sum);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值