数组常见的api方法:第一个参数为函数,第二个参数为this,不是箭头函数的时候才可以改变函数的this指向
//filter:过滤 返回符合return为真的时候的新数组
var newArr = arr.filter((item,index,arr)=>return boolean,newThis)
//map:映射 //return对数组的每一项进行操作返回处理后的新数组,原数组不改变
var newArr = arr.map((item,index,arr)=>return iten*10,newThis)
//forEach:遍历 //没有返回值,无法响应break, continue控制循环,return会跳出当前循环进入下一个循环
arr.forEach((item,index,arr)=>newArr.push(iten*10),newThis)
//find:查找符合的某一项,findIndex:查找符合某一项的索引 //如果查到重复只返回第一个,主要用于查找对象项数组
var arrItem = arr.find((item,index,arr)=>{return item.name == "张三"},newThis)
//reduce:累加 //每一次的return都为第二次的preValue,初始值这里设置为0,不选默认为0
var total = arr.reduce((preValue,item)=>{return preValue+item},0)
闭包:js中一个函数如果访问了外层作用域的自由变量,那么他就是闭包
一个函数包括函数体本身及其上级作用域。
一个函数执行的时候会在堆内存生成一块作用域,执行完按理来说会被垃圾回收。这个函数返回了一个内部函数,且这个内部函数地址赋值给了一个全局对象。这样从全局对象开始形成一条指向外部函数的链,根据垃圾回收机制,从全局对象出发有指向,就不会被垃圾回收。这样就保留了外部函数的作用域,造成内存泄漏。
按ECMA标准,即使bar没用到或者只用部分foo作用域的变量,foo作用域的内存也会保留,但是浏览器会对此进行优化,没用到foo作用域或者部分变量没用到,未使用的都会被清理掉