每日思考(2019/12/29)

题目概览

  • js放在html的<body><head>有什么区别?
  • 说说浏览器解析CSS选择器的过程?
  • 对new操作符的理解

题目解答

js放在html的<body><head>有什么区别?

  • 在HTML body部分中的js会在页面加载的时候被执行。在HTML head部分中的js会在被调用的时候才执行,但是在主页和其余部分代码之前预先装载

    • js 放在<head> 中,如果不添加 async 或者 defer 时,当浏览器遇到 script 时,会阻塞 DOM 树的构建,进而影响页面的加载。当 js 文件较多时,页面白屏的时间也会变长。在这个过程中,如果解析器遇到了一个脚本(script),它就会停下来,并且执行这个脚本,然后才会继续解析 HTML。如果遇到了一个引用外部资源的脚本(script),它就必须停下来等待这个脚本资源的下载,而这个行为会导致一个或者多个的网络往返,并且会延迟页面的首次渲染时间。
    • 把 js 放到 <body> 里(一般在</body>的上面)时,由于 DOM 时顺序解析的,因此 js 不会阻塞 DOM 的解析。对于必须要在 DOM 解析前就要加载的 js,我们需要放在<head>
  • head 部分中的脚本: 需调用才执行的脚本或事件触发执行的脚本放在HTML的head部分中。当你把脚本放在head部分中时,可以保证脚本在任何调用之前被加载,从而可使代码的功能更强大; 比如对*.js文件的提前调用。 也就是说把代码放在<head>区在页面载入的时候,就同时载入了代码,你在<body>区调用时就不需要再载入代码了,速度就提高了
    <html>
    <head>
    <script type=”text/javascript”>
    ….
    </script>
    </head>
  • body 部分中的脚本: 当页面被加载时立即执行的脚本放在HTML的body部分。放在body部分的脚本通常被用来生成页面的内容
    <html>
    <head>
    </head>
    <body>
    <script type=”text/javascript”>
    ….
    </script>
    </body>
  • body 和 head 部分可同时有脚本:你可在文件中放无数的脚本,因此你的文件中可以在body和head部分同时存在脚本。
    <html>
    <head>
    <script type=”text/javascript”>
    ….
    </script>
    </head>
    <body>
    <script type=”text/javascript”>
    ….
    </script>
    </body>
  • 外部脚本的使用:有时候你可能想在几个页面中运行同样的脚本程序, 而不需在各个页面中重复的写这些代码。这时你就要用到外部脚本。你可以把脚本写在一个外部文件中,保存在扩展名为 .js的文件中。
    <html>
    <head>
    <script src=”xxx.js”></script>
    </head>
    <body>
    </body>
    </html>
  • 如果把javascript放在head里的话,则先被解析,但这时候body还没有解析。(常规html结构都是head在前,body在后)如果head的js代码是需要传入一个参数(在body中调用该方法时,才会传入参数),并需调用该参数进行一系列的操作,那么这时候肯定就会报错,因为函数该参数未定义(undefined)
  • 从JavaScript对页面下载性能方向考虑:由于脚本会阻塞其他资源的下载(如图片等)和页面渲染,直到脚本全部下载并执行完成后,页面的渲染才会继续,因此推荐将所有的<script>标签尽可能放到<body>标签的底部,以尽量减少对整个页面下载的影响

说说浏览器解析CSS选择器的过程?

  • 浏览器解析css选择器的规则是从右向左的,这样会提高查找选择器所对应的元素的效率
  • HTML 经过解析生成 DOM Tree;而在 CSS 解析完毕后,需要将解析的结果与 DOM Tree 的内容一起进行分析建立一棵 Render Tree,最终用来进行绘图。Render Tree 中的元素(WebKit 中称为「renderers」,Firefox 下为「frames」)与 DOM 元素相对应,但非一一对应:一个 DOM 元素可能会对应多个 renderer,如文本折行后,不同的「行」会成为 render tree 种不同的 renderer。也有的 DOM 元素被 Render Tree 完全无视,比如 display:none 的元素
  • 在建立 Render Tree 时(WebKit 中的「Attachment」过程),浏览器就要为每个 DOM Tree 中的元素根据 CSS 的解析结果(Style Rules)来确定生成怎样的 renderer。对于每个 DOM 元素,必须在所有 Style Rules 中找到符合的 selector 并将对应的规则进行合并。选择器的「解析」实际是在这里执行的,在遍历 DOM Tree 时,从 Style Rules 中去寻找对应的 selector
  • 因为所有样式规则可能数量很大,而且绝大多数不会匹配到当前的 DOM 元素(因为数量很大所以一般会建立规则索引树),所以有一个快速的方法来判断「这个 selector 不匹配当前元素」就是极其重要的。如果正向解析,例如「div div p em」,我们首先就要检查当前元素到 html 的整条路径,找到最上层的 div,再往下找,如果遇到不匹配就必须回到最上层那个 div,往下再去匹配选择器中的第一个 div,回溯若干次才能确定匹配与否,效率很低。逆向匹配则不同,如果当前的 DOM 元素是 div,而不是 selector 最后的 em,那只要一步就能排除。只有在匹配时,才会不断向上找父节点进行验证。但因为匹配的情况远远低于不匹配的情况,所以逆向匹配带来的优势是巨大的。同时我们也能够看出,在选择器结尾加上「*」就大大降低了这种优势,这也就是很多优化原则提到的尽量避免在选择器末尾添加通配符的原因
  • CSS优化:
    • 不要在id选择器前使用标签名,如div#box,因为id选择器是惟一的,加上div反而增加不必要的css匹配,多此一举
    • 使用 class 代替层级关系,比如#box ul li a{}写成.box-a{}。在CSS渲染效率中,id和class的效率是基本相当的,class会在第一次载入中被缓存,在层叠中会有更好的效果,在根部元素采用id会有微妙的速度优势

对new操作符的理解

  • 含义:new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一
  • 步骤:模拟new操作前,要先知道new操作是发生了什么,就拿new Object()举例
    • 创建一个新对象
    • 把新对象的原型指向构造函数的prototype
    • 把构造函数里的this指向新对象
    • 返回这个新对象
  • 构造函数与原生new
    function constructorFunction(name, age){
      this.name = name;
      this.age = age;
    }
    constructorFunction.prototype.say = function(){
      return 'Hello '+ this.name
    }
    var obj = new constructorFunction('eric', 18)
    console.log(obj.name, obj.age);//'eric', 18
    console.log(obj.say())//Hello eric
  • 模拟new
    function newNew(){
     var newObj = {}
     // 1. 创建一个新对象
     var Con = [].shift.call(arguments)
     // 得到构造函数
     newObj.__proto__ = Con.prototype;
     // 2. 把新对象的原型指向构造函数的prototype
     var res = Con.apply(newObj, arguments)
     // 3. 把构造函数里的this指向新对象
     return typeof res === 'object' ? res : newObj;
     // 4. 返回新对象
    }
    var obj = newNew(constructorFunction, 'eric', 18)
    console.log(obj.name, obj.age);//'eric', 18
    console.log(obj.say())//Hello eric

原文地址:https://www.cnblogs.com/EricZLin/p/12117088.html

时间: 2024-08-30 14:16:29

每日思考(2019/12/29)的相关文章

Web测试实践——每日例会记录12.29

时间:12.29 晚上 地点:东十学生宿舍 我们对本次实践作业展开了详细的讨论,确定了如下内容: 我们从待测产品中选择第 3种(学校相关网站),针对华中科技大学的软件学院网站,竞品对象为华中科技大学计算机学院网站,展开对比分析. 工作分配: 姓名 主要负责部分 完成情况 储志峰 刘伟清 阶段一,软件评测.对华科软院和计院的网站展开对比分析,主要体现在功能.界面等方面.描述网站的缺陷. 吕尚维 阶段二,用户调研.对使用华科软院网站的某个用户展开调研,采访用户的意见建议,收集用户体验的. 翟瑆 阶段

DeepFaceLab更新至2019.12.29

更新内容: == 29.12.2019 == 修复已编辑遮罩脸部的脸部增强器 修复在同一DFL文件夹中使用各种GPU时长时间加载 修复extract unaligned faces avatar模型:默认建模是head fix faceset enhancer for faces that contain edited mask fix long load when using various gpus in the same DFL folder fix extract unaligned f

2019.12.29纪录

------------恢复内容开始------------ 我已经记不清,今天是分开的第几个日子了,昨天晚上翻你微博看到了那个男生的微博,原来你只是还没有确定罢了. 我以为我已经成熟了,已经不是一个孩子了,其实并没有,原来这段感情你是真的放下了,原来只有我一个人像个孩子一样,一遍一遍的抚摸着伤口,又期望着能尽快愈合,算了,分开了就是不合适,希望你能开心吧,希望你和他能够过上你想的生活,我的路还长,我追求的目标还很远,希望不用太久,我也可以遇见那个能够和我并肩走下去的人.祝你们幸福吧.对了,我有

2019.12.29日志

我最近状态是真的差 上午打正睿多校,看了看题,每一题会正解,感觉都可做,t1 $ n^2 $ 式子好推,但就是优化不起来,t2 想了半天一点规律都每推出来,1h看完三题就弃疗了,连表都懒得打出来看一看 然后把昨天的那道sb题调出来了 上午剩下的时间把一篇优质绿文看完了 下午上了会b站被发现,于是被迫开始写作业(困得要死但又不想睡) 晚上规划了一下平衡树学习计划,大概准备学fhq treap,splay和替罪羊树,然后开始看教程,真的啥也看不懂,为什么可以断裂?,这玩意的平衡是怎么维护的啊.看得我

Some Modern Softwares&#39; drawbacks: User experience 12/29/2015

In the nowadays, there are many APP in the PC or smart Phone. Some of them can't meet the customers' need. And I summary some modern softwares' drawbacks and it will guide our team project to the right way. 1. WeChat: 1). Introduction: Wechat is the

2015.12.29~2015.12.30真题回顾!-- HTML5学堂

2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停哦! HTML5真题[2015.12.29]题目 学习JavaScript或应用JavaScript进行脚本开发,“变量”这是必须要学会使用的.什么是变量呢?又什么作用呢?ok,大家稍安勿躁哦,试体验体验这题目<HTML5真题[2015.12.29]题目>与 <HTML5真题[2015.12

Python基础教程—2019/1/29

2019/1/29 // 整除** 乘方0x 十六进制 0b 二进制 0o八进制 常用模块和函数1:pow() 乘方 >> pow(2,3)8>> 2**38>> 2:abs() 绝对值 3:round() 向最接近的那个数取整,如果一样,向偶数取整 >> round(2/3)1>>4:math库的floor()函数,向下取整>> import math>> math.floor(32.9)32>> 5:mat

2019.08.29学习整理

2019.08.29学习整理 绑定方法与非绑定方法 绑定方法 对象绑定方法 类的绑定方法 绑定方法:特殊之处,绑定给谁就是谁来调,并且会把自身调过来 类的绑定方法 绑定给类,类来调用,会把类自身传过来 类的绑定方法用在什么地方 不需要通过对象,只需要通过类就能获取到一些东西的时候,用类的绑定方法 类的绑定方法,可以由对象来调 class Person: ''' 注释的内容 ''' def __init__(self,name,age): # print(self) self.name=name

2019.12.5-特征布局,新闻列表 代码

<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8"> <title>特征布局</title></head><style type="text/css"> .news_list_com{ width: 600px; height: 290px; border:1px solid #ddd