Javascript自学随笔: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的错误和正确实现:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值