面试题笔记
一,重绘和重排
页面出现的过程中:
1,获取html文档,构建DOM树,也就是页面的内容结构;
2,获取style文件,构建style树,也就是如何展示内容;
3,style树和DOM树结合,生成渲染树之后,才绘制网页,最终呈现结果。
重排:当DOM树发生几何变化,导致页面重新计算元素宽高;
重绘:当style树发生内容改变,导致页面样式改变;
注意:重排一定重绘,重绘不一定重排。
二,为了达到移动设备的理想viewport,可以使用meta标签对viewport进行控制,meta标签实现响应式网页的主要属性有:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2, user-scalable=no">
解析:
width – viewport的宽度
height – viewport的高度
initial-scale – 初始的缩放比例
minimum-scale – 允许用户缩放到的最小比例
maximum-scale – 允许用户缩放到的最大比例
user-scalable – 用户是否可以手动缩放
三,js闭包函数
1,特点:
四,前端事件冒泡和事件捕获
五,es6的经典语法
1,箭头函数
六,js中的函数提升和变量提升(注意es6的块级作用域)
1,变量提升:js先将全部的变量进行声明,再回到声明的地方进行赋值,变量的声明的过程就是变量的提升。//变量声明是提升的,赋值是顺序的。
2,函数提升:直接将整个函数整体提升到作用域的最开始位置,相当于剪切过去的样子。
函数提升只会提升函数声明,而不会提升函数表达式:
function foo1 () {
console.log("foo1");
};//提升,并且提升之后为:var foo1 = function(){...},此时foo1是作为一个变量。
var foo2 = function () {
console.log("foo2");
};//不提升
3,变量和函数同时发生提升:函数提升优于变量提升。
注意:只有声明的变量和函数才会进行提升,隐式全局变量不会提升。“提升”的本质就是为了事先声明变量和函数,当然函数只有声明式函数才会被提升,字面量函数不会被提升。这种提升就是存在于作用域中,包括全局作用域、函数作用域(闭包形成的作用域也是个函数作用域),总之都是在作用域中声明变量和函数时,会提升到作用域顶部,进行事先声明。
JavaScript没有块作用域,只有全局作用域和函数作用域。ES6新增了let和const关键字,使得js也有了“块”级作用域,而且使用let和const 声明的变量和函数是不存在提升现象的,比较有利于我们养成良好的编程习惯。
es6标准:
1,允许在块级作用域内声明函数;
2,函数声明(函数名称) 类似于 var,即会提升到全局作用域或函数作用域的头部;
3,同时,函数声明(函数整体) 还会提升到所在的块级作用域的头部。
ps:
function xxx(){} 这种函数声明。而不是 var xxx = function(){}这种函数表达式。前者,用本文的逻辑去考虑函数的提升和函数的块级作用域;后者,等价于变量的提升和变量的块级作用域。
如果换做严格模式下的 node 环境,那么将严格遵守 es6 标准:函数声明类似于 let。
ps:
声明全局变量:
1,函数内部没有声明,直接给变量赋值的是声明全局变量,执行函数的时候不进行变量提升;
2,函数内部写成 var a = b = c = 20; //隐式声明了全局变量b和c,b和c没有进行变量提升,但是a有;
3,var a =20, b = 30,c = 40; //中间以,分隔开表示同时定义了局部变量a,b,c,都进行变量提升;
4,var a =20; b = 30; c = 40; //中间以;分隔开表示同时定义了一个局部变量a和全局变量b和c,a有变量提升,b和c没有;
其实4和2是相等的。
七,js基本数据类型
1,JS基本有5种简单数据类型:String,Number,Boolean,Null,undefined。一种复杂的数据类型Object。
2,ES6基本数据类型:
ES6新增数据类型Symbol: 表示独一无二的值
typeof Symbol() // 'symbol'
typeof Number() // 'number'
typeof Sring() // 'string'
typeof Function() // 'function'
typeof Objecr() // 'object'
typeof Boolean() // 'boolean'
typeof null() // 'object'
typeof undefined() // 'undefined'。
八,域
九,关于this,当前对象
1, window自动被浏览器声明
// 1.调用对象未声明的属性会undifned
var user={};
console.log(user.name);//undifned
// 2.使用未赋值只声明的基本数据类型会undifned
var one;
console.log(one);//undifned
// 3.使用未声明的变量会报错
console.log(two);//new_file.html:15 Uncaught ReferenceError: two is not defined
window对象已经自动被浏览器声明了,只是还没有声明count属性,所以调用window对象的未声明属性也是undifned
2,函数使用严格模式‘use strict’:
function foo(){'use strict'
console.log(this.location);
}
foo();//'use strict'是严格模式,严格模式函数中法this禁止指向全局对象window,这个this是undefined。
3,