闭包
内部函数可以访问外部函数的值 该值长期存储在内存中 因此产生了闭包
闭包是一种保护私有变量的机制 在函数执行时形成私有的作用域 班里里面的私有变量不受外界感染 形成一个不销毁的栈环境 实现了传递值和功能的调用
优点:避免变量污染全局 变量的叠加使用
缺点:因为常驻内存 如果有大量闭包不被释放 容易造成内存溢
var let const 关键字的区别
let/const声明的变量只在let/const命令所在的代码块{}内有效 在{}之外不能访问
使用let/const关键字声明的全局作用域变量不属于window对象 所有不可以用window 变量名的方式访问这些变量
var 变量提升 let const不会
var可以重复声明 let const 不可以
let声明的变量可以重复赋值 const不可以
let和var都用于声明变量 const用于声明常量
function和箭头函数的区别
箭头函数不可以当做构造函数 不可以使用new命令 否则会抛出错误
this arguments caller等对象在箭头函数体内都不存在
箭头函数this指向上一层作用域 function的this指向调用他的对象
js工厂函数
工厂函数用于创建对象的一个函数 这些内建函数都是类对象 调用时实际上是创建了一个类实例 也就是先利用类创建一个对象 返回返回这个对象 创建的函数都拥有相同的属性 是一个函数 用来创建对象 向工厂一样 生产出来的函数都是标准件(拥有同样的属性)
原型链--函数与对象的关系
function函数是所有函数的祖先函数
所有构造函数都有一个prototype属性叫原型对象 也称为显式原型
所有原型对象都有一个constructor属性 指向被new的构造函数
被new出来的对象叫实例对象它们都有一个__proto__对象 叫隐式原型 它指向构造函数的prototype对象
原型链就是当从对象上获取属性的时候 查找顺序先从对象自身查找 如果没有就沿着__proto__一直找
更改this指向的三种方法
call
语法:函数名.call(调用者,参数1,...)
作用:函数被借用时 会立即执行 并且函数体内的this会指向借用者或调用者
apply
语法:函数名.apply(调用者,[参数,...])
作用:函数被借用时 会立即执行 并且函数体内的this会指向借用者或调用者
bind
语法:函数名.bind(调用者,参数,...)
作用:函数被借用时 不会立即执行 而是返回一个新的函数 需要自己手动调用新的函数来改变this指向
总结:相同点:三者都可以把一个函数应用到其他对象身上 注意不是自身对象
不同点:call,apply是直接执行函数调用 bind是绑定 执行需要再次调用
call bind接收逗号分隔的无限个参数列表 apply接收数组作为参数
暂时性死区
es6: 当let或const放在{}里的时候 这个{}就会变成块级作用域 被let或const声明的变量锁死--暂时性死区
es5: 作用域只有全局的window和局部的函数作用域 受条件限制 for循环 if和switch里的变量会污染全局 现在有了let和cosnt之后 凡事有{}的代码块里面使用了let或const 则{}就会变成块级作用域
Es6的class类
class类是使用函数的prototype对象封装的 可以实现封装 多态和继承
类有constructor函数作为初始化类时调用的第一个构造函数
类使用extends实现类之间的继承