一、垂直居中
方法1:绝对定位 + 元素上下左右为0 + margin:auto
方法2:table-cell
方法3:绝对定位 + 元素上左:50% + margin上左:-50%自身高度 (自身高度已知情况)
方法4:过渡
方法5:flex
二、原型与原型链
1.读取属性时,会沿着隐式原型链查找
2.设置属性时,不会查找原型链,会在对象中直接添加
3.一般方法定义在原型中,属性通过构造函数定义在对象本身上
function Person(name,age){
this.name = name
this.age = age
}
Person.prototype.setName = function(name){
this.name = name
}
4.instanceof是如何判断的?
表达式: A instanceof B
如果B函数的显式原型在A对象的原型链上,则true
三、执行上下文
1.变量声明提升
通过var定义的变量,在定义的语句之前就能访问,值:undefined
2.函数声明提升
通过function声明的函数,在函数之前就能直接调用,值:函数对象
3.执行上下文
代码分类:全局代码,函数代码
4.执行上下文栈
执行前产生,定义却不调用不会产生
执行上下文对象的个数: N(函数调用的次数) + 1 (window)
5.作用域与作用域链
作用域:全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了,是静态的,不会再变化
执行上下文是动态的,调用时创建,调用后会自动释放
6.闭包
函数体要保存,闭包才会存在 f = fn1() 产生的条件:函数嵌套 + 内部函数引用了外部函数的变量
闭包的作用: 使函数内部的变量在函数执行完后,仍然存活在内存中;让函数外部可以读写到函数内部的变量
生命周期:产生,定义时产生;死亡,成为垃圾对象时 f = null 解决循环遍历加监听产生的闭包
1.将每次 i 的值单独保存 var btn = btns[i] btn.index = i
2.使用立即执行函数
3.使用promise
7.原型链继承
子类型的原型为父类型的一个实例对象
Sub.prototype = new Supper()