标签: 面试

  • 闭包

    作用:实现数据私有

    内层函数, 引用外层函数上的变量, 就可以形成闭包。

    一个小例子

    function count() {
    	let num = 0 //只能在count函数中访问到
    	function add() {
    		num++
    		console.log(num)
    	}
    //执行count函数会返回add函数,相当于外面可以执行add函数,且不能直接访问修改num
    	return add
    }
    
    //addFN等价于返回的add函数
    let addFN = count()
    addFN() //1
    

    给闭包传值

    function sum(x) {
    	return function (y) {
    		return console.log(x + y)
    	}
    }
    
    //此时传值给sum函数的x
    let fn = sum(3) 
    
    //此时传值给内部匿名函数的y
    fn(10) 
    
    // 控制台结果为13
    
  • js执行机制

    JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.

    单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.

    这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉.

    同步和异步

    利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程.

    于是,JS 中出现了同步异步.

    同步

    前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。

    异步

    在做一件事的同时,还可以去处理其他事情.

    同步任务

    同步任务都在主线程上执行,形成一个执行栈

    异步任务

    JS 的异步是通过回调函数实现的


    一般而言,异步任务有以下三种类型:

    • 普通事件,如 click、resize 等
    • 资源加载,如 load、error 等
    • 定时器,包括 setInterval、setTimeout 等

    异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)

    异步JavaScript

    https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Asynchronous/Introducing

    通用异步编程概念

    https://developer.mozilla.org/zh-CN/docs/conflicting/Learn/JavaScript/Asynchronous/Introducing

    执行机制

    • 先执行执行栈中的同步任务
    • 异步任务放入任务队列中
    • 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行

    主线程不断的重复获得任务、执行任务、再获取任务、再执行,这种机制被称为事件循环Event Loop

    并发模型与事件循环 – JavaScript | MDN

  • CSS绘制三角形(各种角度)

    一、前言

    三角形实现原理:

    1. 宽度width为0;height为0;
    2. 有一条横竖边(上下左右)的设置为border-方向:长度 solid red,这个画的就是底部的直线。其他边使用border-方向:长度 solid transparent
    3. 有两个横竖边(上下左右)的设置,若斜边是在三角形的右边,这时候设置top或bottom的直线,和右边的斜线。若斜边是在三角形的左边,这时候设置top或bottom的直线,和左边的斜线。

    二、实现

    2.1 Triangle Up

    #triangle-up {
        width: 0;
        height: 0;
        border-left: 50px solid transparent;
        border-right: 50px solid transparent;
        border-bottom: 100px solid red;
    }

    2.2 Triangle Down

    #triangle-down {
        width: 0;
        height: 0;
        border-left: 50px solid transparent;
        border-right: 50px solid transparent;
        border-top: 100px solid red;
    }

    2.3 Triangle Left

    #triangle-left {
        width: 0;
        height: 0;
        border-top: 50px solid transparent;
        border-right: 100px solid red;
        border-bottom: 50px solid transparent;
    }

    2.4 Triangle Right

    #triangle-right {
        width: 0;
        height: 0;
        border-top: 50px solid transparent;
        border-left: 100px solid red;
        border-bottom: 50px solid transparent;
    }

    2.5 Triangle Top Left

    #triangle-topleft {
        width: 0;
        height: 0;
        border-top: 100px solid red;
        border-right: 100px solid transparent;
    }

    2.6 Triangle Top Right

    #triangle-topright {
        width: 0;
        height: 0;
        border-top: 100px solid red;
        border-left: 100px solid transparent;
    
    }

    2.7 Triangle Bottom Left

    #triangle-bottomleft {
        width: 0;
        height: 0;
        border-bottom: 100px solid red;
        border-right: 100px solid transparent;
    }

    2.8 Triangle Bottom Right

    #triangle-bottomright {
        width: 0;
        height: 0;
        border-bottom: 100px solid red;
        border-left: 100px solid transparent;
    }

    纯 CSS 实现绘制各种三角形(各种角度) – saucxs – 博客园

  • 解决外边距塌陷(折叠):行内元素的margin和padding无效

    外边距折叠

    1.外边距合并

    场景:垂直布局块级元素,上下的margin会合并

    结果:最终两者距离为margin的最大值

    解决方法:避免就好
    • 只给其中一个盒子设置margin即可

    2.外边距塌陷

    场景:互相嵌套块级元素,子元素的 margin-top 会作用在父元素上

    结果:导致父元素一起往下移动

    解决方法:

    1. 父元素设置 border-top 或者 padding-top (分隔父子元素的margin-top)
    2. 父元素设置overflow:hidden
    3. 转换成行内块元素
    4. 设置浮动

    行内元素的margin和padding无效情况

    场景:给行内元素设置margin和padding时

    结果:

    • 水平方向的margin和padding布局中有效
    • 垂直方向的margin和padding布局中无效
  • 清除浮动

    如果子元素浮动了,此时子元素不能撑开父元素。
    目的:需要父元素有高度,从而不影响其他网页元素的布局

    1.直接设置父元素高度

    • 优点:简单粗暴,方便
    • 缺点:有些布局中不能固定父元素高度。如:新闻列表、京东推荐模块

    2.额外标签法

    方法:

    • 在父元素内容最后添加一个块级元素
    • 给添加的块级元素设置 clear:both

    缺点:会在页面中添加额外的标签,会让页面的HTML结构变得复杂

    3.单伪元素清除法

    基本写法:

     .clearfix::after{
     ​
     content:'';
     ​
     display:block
     ​
     clear:both
     ​
     }

    补充写法:

     .clearfix::after{
     ​
     content:'';
     ​
     clear:both
     ​
     /* 补充代码:在网页中看不到伪元素 */
     ​
     height:0;
     ​
     visibility:hidden;
     ​
     }

    优点:项目中使用,直接给标签加类即可清除浮动

    4.双伪元素清除法

     .clearfix::before,
     ​
     .clearfix::after{
     ​
     content:'';
     ​
     display:table;
     ​
     }
     ​
     .clearfix::after{
     ​
     clear:both;
     ​
     }

    优点:项目中使用,直接给标签加类即可清除浮动

    5.给父元素设置overflow : hidden

    (拓展补充)

    BFC的介绍

    ➢ 块格式化上下文(Block Formatting Context):BFC

    是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

    ➢ 创建BFC方法:

    1. html标签是BFC盒子
    2. 浮动元素是BFC盒子
    3. 行内块元素是BFC盒子
    4. overflow属性取值不为visible。如:auto、hidden…
    5. ……

    ➢ BFC盒子常见特点:

    1. BFC盒子会默认包裹住内部子元素(标准流、浮动)→ 应用:清除浮动
    2. BFC盒子本身与子元素之间不存在margin的塌陷现象 → 应用:解决margin的塌陷
    3. ……