作业帮 前端 一面
自我介绍!
你参与最多的项目,简单的介绍一下,你在里面担任的角色以及你做了哪些工作!巴拉巴拉一顿输出
浏览器输入url一直到页面渲染的过程?
当服务器返回html之后,scrpit标签会阻塞吗?不加defer一定会阻塞吗?
script用src引用js/css会做什么?
页面首次打开后闪烁后再出现内容 样式是后面应用添加的 是什么原因?
提交按钮多次点击,怎么解决多次请求来提升性能? 防抖
手写一个防抖函数?在防抖函数里面为什么要使用aplly来绑定this?如果不用apply,能拿到点击事件吗?
如果不用apply,想直接用func(args),修改其他部分使函数功能不变,如何实现?
代码输出题:
function a(){
const fn = (e)=>{console.log(this,e)}
fn('fn func')
}
这个里面this指向的是什么?我当时回答的是指向全局对象window,当时没有get到面试官的点,他想要我回答指向函数a
你了解eventbus吗?讲解一下,也就是发布订阅者模式。实现事件总线eventbus!当时说我只了解概念,不会写!!!
然后面试官就换了一个遍历树的方法!将一个树的所有节点的值全部以数组的格式输出出来!我当时使用了一个递归的方法实现出来了,然后又问:当树的深度很大时,会不会发生内存爆掉的现象?然后巴拉巴拉一顿输出。。。。然后就是可以使用层次遍历来解决这个问题!然后就是把层次遍历也写了一遍!
最后问了一下怎么学习前端的?如何去了解前端前言技术的!!!
反问。。。。
你参与最多的项目,简单的介绍一下,你在里面担任的角色以及你做了哪些工作!巴拉巴拉一顿输出
浏览器输入url一直到页面渲染的过程?
当服务器返回html之后,scrpit标签会阻塞吗?不加defer一定会阻塞吗?
script用src引用js/css会做什么?
页面首次打开后闪烁后再出现内容 样式是后面应用添加的 是什么原因?
提交按钮多次点击,怎么解决多次请求来提升性能? 防抖
手写一个防抖函数?在防抖函数里面为什么要使用aplly来绑定this?如果不用apply,能拿到点击事件吗?
如果不用apply,想直接用func(args),修改其他部分使函数功能不变,如何实现?
代码输出题:
function a(){
const fn = (e)=>{console.log(this,e)}
fn('fn func')
}
这个里面this指向的是什么?我当时回答的是指向全局对象window,当时没有get到面试官的点,他想要我回答指向函数a
你了解eventbus吗?讲解一下,也就是发布订阅者模式。实现事件总线eventbus!当时说我只了解概念,不会写!!!
然后面试官就换了一个遍历树的方法!将一个树的所有节点的值全部以数组的格式输出出来!我当时使用了一个递归的方法实现出来了,然后又问:当树的深度很大时,会不会发生内存爆掉的现象?然后巴拉巴拉一顿输出。。。。然后就是可以使用层次遍历来解决这个问题!然后就是把层次遍历也写了一遍!
最后问了一下怎么学习前端的?如何去了解前端前言技术的!!!
反问。。。。
全部评论
function a(){
const fn = (e)=>{console.log(this,e)}
fn('fn func')
}
this是指向window,面试官想考察什么呢
求bg
层序遍历实现:
function levelOrderValues(root) {
if (!root) return []; // 空树返回空数组
const result = []; // 存储最终节点值的数组
const queue = [root]; // 队列用于按层次缓存节点
// 当队列不为空时,继续处理下一层
while (queue.length > 0) {
// 当前层的节点数量(用于区分层级)
const levelSize = queue.length;
// 遍历当前层的所有节点
for (let i = 0; i < levelSize; i++) {
const node = queue.shift(); // 取出队首节点
result.push(node.val); // 将当前节点值存入结果
// 若有左孩子,加入队列(下一层节点)
if (node.left) queue.push(node.left);
// 若有右孩子,加入队列(下一层节点)
if (node.right) queue.push(node.right);
}
}
return result;
}
递归遍历树的所以节点:
function preOrderValues(root) {
const result = [];
// 递归辅助函数
function traverse(node) {
if (!node) return; // 空节点直接返回
result.push(node.val); // 先存入当前节点值
traverse(node.left); // 递归左子树
traverse(node.right); // 递归右子树
}
traverse(root);
return result;
}
防抖函数:
function debounce(fn, delay) {
// 用于存储定时器的标识
let timer = null;
// 返回一个新的函数,这个函数会对原函数进行防抖处理
return function(...args) {
// 保存当前this上下文,确保fn执行时this指向正确
const context = this;
// 如果已经存在定时器,清除它(重置计时)
if (timer) {
clearTimeout(timer);
}
// 重新设置定时器,delay毫秒后执行原函数
timer = setTimeout(() => {
// 执行原函数,并传递正确的this和参数
fn.apply(context, args);
// 执行完成后清空定时器标识
timer = null;
}, delay);
};
}
相关推荐
10-14 21:06
西北农林科技大学 数据分析师 点赞 评论 收藏
分享
点赞 评论 收藏
分享