前端复习笔记

个人笔记,有错必改,期待指出…

闭包
阮一峰闭包理解地址

 function fun() {
      let a = 123;
      var b = 567;
      function num() {
             a++;
             b++;
                     //a b 值会被缓存
      }
      return num();
    }
    fun()

    // function f1() {
    //   let n = 999;
    //   nAdd = function () { n += 1 }//此处nAdd没有var 是一个全局变量(一般函数中this指向window)
    //   function f2() {
    //     alert(n);
    //   }
    //   return f2;
    // }
    // var result = f1();
    // result(); // 999
    // nAdd();
    // result(); // 1000

///闭包是由函数和词法环境组成,特点有可以使用其他函数内部变量,内部变量被缓存,在执行结束后不会被垃圾回收机制清除,
///使用闭包注意 使用后手动清除变量
    // var name = "The Window";
    // var object = {
    //   name: "My Object",
    //   getNameFunc: function () {
    //     return function () {
    //       return this.name;//此处this指向window
    //     };
    //   }
    // };
    // console.log(object.getNameFunc())
    // alert(object.getNameFunc()());


    // var name = "The Window";
    // var object = {
    //   name: "My Object",
    //   getNameFunc: function () {
    //     console.log(this)//此处函数作为方法使用getNameFunc  this指向调用该方法的实例obj
    //     var that = this;
    //     return function () {//整个函数被return出到window 此时this指向window
    //       console.log(this)
    //       return that.name;
    //     };
    //   }
    // };
    // console.log(object.getNameFunc())
    // alert(object.getNameFunc()());

for循环与while循环区别?
一般情况可以等效代替的
区别在于:
for循环次数已知 ,小括号内定义变量只能在循环内使用 .是根据变量变化循环,一般用于有规律的重复操作中,如数组、对象等迭代
while 循环次数未知,初始表达式在外边定义 ,循环外循环内都可以使用 . 一般用于动态变量,当年特定条件的重复操作
控制语句:
break: 立即结束当前循环
continue: 结束当前循环剩下内容进行下次循环
浏览器工作原理
浏览器结构
对应博客

渲染过程
1. DOMTree的构建
1>第一步(解析) : 从网络或磁盘下读取html原始字节码,通过设置的charsest(字符集,比如utf-8),转化成相应字符(比如开发中字符

hello

)
2> 第二部(token化) : 通过词法分析器,将字符串解析成Token,Token中会标注出当前Token是开始标签还是结束标签或文本标签
3>第三步 (构建DOM树) : 浏览器会根据第二部里记录的所有开始标签/结束标签串联起来,构建DOM树
2. CSSOMTree的构建
CSSOM的生成过程和DOM的生成过程十分相似 1.解析,2.Token化,3.生成Nodes并构建CSSOMTree
CSSOMTree需要等到完全构建后才可以被使用,因为后面的属性可能会覆盖掉前面的设置。
官网解释 :
3. 渲染树的构建
DOM树上没一个节点对应着网页里每一个元素.CSSOM树上每一个节点对应着网页里每一个元素的样式,浏览器可以通过JavaScript操作DOM/CSSOM树,动态改变它的结构.但DOM/CSSOM树本身并不能用于排版和渲染, 浏览器会另外生成Render树
注意: Render树是浏览器排版引擎和渲染引擎的桥梁.是排版引擎的输出,渲染引擎的输入
4. 布局 :此时浏览器已经计算出了那些节点是可见的以及它的信息和样式,之后就是计算节点在设备窗口内位置和样式,这个过程是布局. 布局输出的是一个’盒模型’:将所有相对测量值都转换成屏幕上的绝对像素

  未构建完的CSSOMTree是不准确的,浏览器必须等到CSSOMTree构建完毕后才能进入下一阶段。 所以,CSS的加载速度与构建CSSOMTree的速度将直接影响首屏渲染速度,因此在默认情况下CSS被视为阻塞渲染的资源,需要将它尽早、尽快地下载到客户端,以便缩短首次渲染的时间。

在标签没有设置async/defer属性时,同理,JS也会可以修改CSS样式,影响CSSOMTree最终的结果. js会阻塞DOM的生成。如果JS试图在浏览器还未完成CSSOMTree的下载和构建时去操作CSS样式,浏览器会暂停脚本的运行和DOM的构建,直至浏览器完成了CSSOM的下载和构建。也就是说,JS脚本的出现会让CSSOM的构建阻塞DOM的构建。

浏览器性能
1>减少DOM的回流和重绘
1. 放弃传统dom操作,使用vue react的数据响应式框架mvvm /mvc/ virtual dom /dom diff/
2. 样式集中改变 :例如:向#box盒子中动态插入5个span,当前代码会引发5次回流. 优化思路:不是创建一个span就放置在页面中,而是把5个创建好,整体添加到页面中 .实例
3. 动画效果应用到position:absolute/fixed上(脱离文档流)
4. 基于transform修改元素样式:trabsform直接跳过render tree和layout阶段,直接把更改的样式告诉"合成线程:去渲染,不然会回流只会重绘,因为transform开启了渲染的硬件加速

1. 回流和重绘:传统操作DOM消耗性能的原因,DOM的回流(重排)和重绘.
回流: 页面布局或者几何信息发生改变, 浏览器可能需要重新计算DOM节点或者计算每个元素在设备视图上位置和大小,重新计算完成后,让浏览器重新渲染
1>回流必然发生重绘
2>页面第一次加载必然会有一次回流
3>DOM的样式发生改变,浏览器窗口大小或者视图发生改变
重绘:元素样式发生改变,几何信息和结构信息不变,此时只需要把改变的元素重新渲染即可,比如颜色 背景
为什么有时候在js中访问DOM时会报错?
因为浏览器在构建DOM树时候,遇到script或者link标签时候,会根据src对应地址去加载资源,在script里没有设置async/defer属性时候,这个加载过程是"下载并执行所有代码",此时DOM树还未完全构建完成,此时js访问script标签后面DOM元素时候,会报找不到改元素的错误
页面优化:
吧css文件放html文档中的前面引入,js文件在后面引入
配合理解
注意 : 当浏览器遇到一个script标签时,DOMTree的构建将被暂停,直至脚本执行完毕
JavaScript可以查询和修改DOMTree与CSSOMTree

参考博客

this指向

    // 总结 :谁调用指向谁;
    console.log('全局this', this);//全局变量this指向window
    function fun() {//一般函数中this指向window
      console.log('一般函数中this', this);

    }
    function Fun1() {//构造函数this指向等于 调用它的实例(new Fun1())的this指向,//此处是window
      console.log('构造函数中this',this)
      let arr = () => {//箭头函数作为一个对象的方法调用时候,this指向调用函数的对象指向
      console.log('箭头函数中this', this);
      };
      arr();
      fun();
    }
    new Fun1()

改变this指向call apply bind
call 的第一个参数是this指向,传参一次排后,//第一个参数传null this指向window///
返回:有指定this值和参数的函数的结果
apply 的第一个参数shithis指向,第二个参数是数组形式
bind 的第一个参数是this指向,传参一次排后,返回是新的函数 ,需要调用执行
返回: 返回一个原函数的拷贝,并拥有指定的 this 值和初始参数
//当使用new 调用时候bind的第一个参数无效
判断是否为NaN0

 isNaN(value);//es5
 // isNaN本意是通过Number方法把参数转换成数字类型,如若转换成功,则返回false,反之返回true,它只是判断参数是否能转成数字,不 能用来判断是否严格等于NaN。
 Number.isNaN(value);//es6
 //Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。
Number.isFinite()//对于非数值一律返回false, 
///用来检查一个数值是否为有限的(finite),即不是Infinity。

display:none; opacity:0; visibility:hidden;

1>display:none;//元素隐藏并且不占位置, 
2>visibility:hidden;//元素隐藏占位置
3>opacity:0; //元素透明隐藏,有点击事件

文本溢出…

      text-overflow:ellipsis;
      overflow:hidden;
      white-space:nowrap;

重绘
需要计算生成dom树
绘流
不需要计算重新生成dom树
display:none
生成dom树时候都在 ,在渲染页面时候舍弃
visibility: hidden 在渲染页面之后隐藏不显示,只是占位置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白菜1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值