闭包
一等公民
在js中函数是一等公民
函数使用很灵活,可以作为参数,也可以作为返回值
高阶函数
函数接收函数作为参数或者返回函数,则该函数称为高阶函数
eg:
array.filter/reduce/find/findIndex/map.forEach
函数与方法
独立使用的 Function
做为对象的属性 method
What
函数
+自由变量
一个函数访问了外层作用域的变量,这种函数+外层变量的组合就是闭包
闭包的内存泄漏
闭包函数的父级作用域指向定义时函数的ao对象,ao对象就不会被销毁
这样的ao对象多了,造成内存泄漏
解决 fn=null
如果ao对象中有一个属性一直没有用到,这个属性会被销毁吗??
js引擎优化,删掉
this指向
java中的this ,一般用在类中的方法中,this指向当前的调用对象
全局作用域
浏览器环境下 this指向window
node 环境下 this指向{}
文件当作模块->加载->编译->放入一个函数fn
执行fn.apply({},…)
因此this指向{}
函数作用域
运行到函数代码执行,
- 先创建函数的变量对象AO
变量/函数的声明 - 然后创建函数执行上下文
函数执行上下文中有
VO:AO
作用域链:AO+父级的变量对象(编译期决定了)
this:由函数的调用决定 - 函数执行上下文入栈
不同的函数调用方式this指向不同
- 全局调用
- 作为对象的方法调用
- call/apply/bind调用
this 的绑定规则
默认绑定
函数没有调用者,独立函数调用
指向全局window
隐式绑定
函数有调用者,作为对象的方法调用
指向调用者
显式绑定
使用call,appy,bind等函数
显式指定
this的指向
new 绑定
new Foo()
- 创建一个空对象
- 将Foo()函数内部的
this指向这个空对象
- 执行Foo函数
- Foo默认返回this也就是这个执行后的空对象
规则之外
call,apply,bind 如果传入undefined,null
this指向window
(obj.bar = obj.fn)()
指向window??实际报错
内置函数的this
- 内置api,setTimeout 等 指向全局window
- 监听事件,boxDiv.addEventListner(‘click’,fn) 指向boxDiv
- js数组的方法 map/reduce/filter 指向window
箭头函数的this
箭头函数简写
- 只有一个参数
a=>{}
- 只有一条函数语句,默认return
()=>arg=5
- 只有一条函数语句,但是是语句是对象
()=>({a:4})
箭头函数
this
常见的this绑定规则失效,没有自己的this,this指向上层作用域中的this
arguments类数组对象
arguments的特点
- 可以迭代,arguments[idx]
- argums.length
- 是对象 , 没有数组的方法
普通函数的arguments,默认存在在ao对象中,用于收集函数的参数
箭头函数没有arguments对象来收集函数的参数,...args
剩余参数语法来收集参数
如何将类数组对象转化成数组对象
- 遍历,将每一个元素push进newArr
- Array.prototype.slice.call()
- Array.from()
绑定规则的优先级
new > 显示绑定 > 隐式绑定 > 默认绑定
函数式编程
纯函数
条件:
- 相同的输入,确定相同的输出
- 不会产生函数副作用,例如一些触发事件,函数执行后修改外部状态等等
例如slice与splice,splice会修改原数组,不是纯函数
柯里化函数
一个函数接收多个参数
变成多个函数的组合来接收参数
具体实现过程:通过在函数内部return一个函数
这个过程称之为柯里化
作用
- 使得函数的职责单一
- 复用函数逻辑
组合函数
当我们需要对一个数据进行函数的调用,会依次执行两个函数
如果每次都执行这两个函数的调用,操作重复
是否有一种方法,将这两个函数组合起来,自动依次调用