Function
Function
简介
function是object, 有属性和方法。属性有length和prototype,前者input 长度后者指向function自带的方法。
方法有:call, apply和 bind,后面会介绍。
Arrow Function VS Function
1.Aguments在function里可以调出input array,arrow function里不能。
2.this 在arrow function里指arrow function被定义时上下文的object,在function里指上下文的object。
ES6:Spread Operator
[…a], {…a}
function a(a, …values){}
let a = (…values)=>{}
Function Declaration VS Function Expression
声明式函数:在执行代码前就预加载,术语为变量提升hoisting。function x(){}
表达式函数:到本行才执行。
Function的重要内部对象
arguments: array,arguments.callee指回原function,用于引用的原函数可能会更名的场合。
this:
this 在arrow function里指arrow function被定义时上下文的object,在function里指上下文的object。
一般在event和timeout里,在用arrow function用this能保持被定义时的上下文。
caller:reference to the caller function。
new.target:reference to the constructor.
call, apply & bind
apply:(this, args)运行this指向的函数。
call:(this,arg1,arg2…),同上。
bind:创建function实例,但不运行。
他们的特点在于通过能灵活改变this的上下文来复用代码逻辑。
closure闭包
函数能从别的函数作用域读取变量。一般做法是在function里创造function。原理是即便内部函数在别的地方被执行,他的作用域链在定义时就包含了外部函数。
‘this’ in closure:原理不变,但要注意,在执行代码时,this的含义会随上下文的改变而改变,而this和arguments本身又是作用域链里的对象。这样随着调用方式的不同,作用域链也会发生微妙改变。避免方式:let that = this;然后that代替this,就像保存一个副本。
私有函数
利用闭包,定义内部this.xxx()函数,通过作用域链调用外部函数里的私有变量。
*Memory Management for Recursive Function (ES6)
*Tail Calls Optimization尾调用优化
原理:检查函数在调用栈是否能被安全推出而不影响正确的结果。
注意:虽然有些阴间面经考这玩意,但截至19年末,主流浏览器里只有safari支持这个。
要求:
1.strict mode,(为了禁止argument和caller);
2.外部函数返回尾调用函数;
3.尾调用函数(TCF)返回值后即是外部函数的结尾;
4.TCF不是外部函数任何变量的闭包。
eg. Memory in ES5 VS ES6:
function outF(){
return inF();}
ES5:
1.->function outF(), outF被推入调用栈;
2.执行outF内容,inF被推入调用栈;
3.执行inF内容,返回结果;
4.结果传递入outF,继续执行下文直到返回结果。
ES6:
1.->function outF(), outF被推入调用栈;
2.执行outF内容,确认OutF的结果依赖于inF的结果,所以会执行inF;
3.确认outF可以被推出而不影响return的结果,因为outF的结果就是inF的结果;
4.outF被推出调用栈;
5.inF被推入调用栈,执行inF内容,返回结果;
6.推出inF。
eg.TCO的错误和正确实现: