JS 函数

由于有C、java等知识的基础,最基本的不再赘述。

复习下变量提升和函数提升:通过var定义的变量,再定义语句之前就能访问到,值为undefined

                                               通过function声明的函数,在之前就可以直接调用,值为函数对象(定义)这样会输出undefined,因为函数只能通过function声明的方式来提升,这个只是变量提升

callee

callee 是 arguments 对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内。

应用场景,当有递归函数时,可能存在匿名函数,那么可以用callee(这里代码写错了,当n为2时,返回应该为1才对)

 

闭包

1.闭包时如何产生的?

当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包

2.闭包是什么

就是包含被引变量(函数)的对象

3.产生闭包的条件

函数嵌套 并且 内部函数引用了外部函数的数据(变量/函数)  并且执行函数定义

 

闭包的应用场景

1.将函数作为另一个函数的返回值

有意思的是,这里的输出并不相同,也就是说之前提到的那个闭包对象一直存在

这里为什么两次输出不一样,按照常理(C、java)来说,函数执行完毕后局部变量会销毁,那么相同的函数执行结果应该是一样的才对啊。

让我们来分析一下过程,根据之前的描述,存在函数嵌套,嵌套中有被引变量并且执行了函数定义就会产生闭包。根据图片,也就是只有在fun函数执行的时候,有嵌套,有fun2的定义,有引用,此时才会生成闭包对象(浏览器调试时显示closure),而图中fun只执行了一次,所以全程只有一个闭包,那么当第二个b执行时,第一个闭包依然存在。

至于为什么依然存在,原因使var b = fun()起了作用,如下图:

fun返回了一个函数引用给b,而这个地址保存了fun的内容(虽然fun不存在了),其中当然也包含了闭包

2.将函数作为实参传递给另一个函数调用

闭包产生的过程:showDelay作为外部函数,function作为内部函数,内部中引用了msg,注,time并不是被引用的成员

 

闭包的作用

1.使函数的内部变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)

2.让函数外部可以操作(读写)到函数内部的数据(变量/函数)

总之,就是实现了内部变量对外不可见,但外部可以操作。

再举个例子:

这里的aaa方法返回了一个函数数组,每一项会返回对应数组的下标,但它的输出结果全是10.

还是闭包的问题,函数中for循环内的var i可以看作先声明在外面,根据前面我们知道aaa执行后只有一个闭包对象,而这个对象中包含了一个i变量,而这个i变量对于整个数组中的每一项来说是公共的,当i改变时其他都会改变。

 

闭包的生命周期

产生:在外部函数执行,并且内部函数定义后就产生了(由于有函数提升,所以一般进入外部函数后就已经产生了)

死亡:包含闭包的函数对象称为垃圾对象即为死亡

 

闭包的缺点

函数执行完后,函数内的局部变量没有释放,占用内存时间会变长,容易造成内存泄漏

解决:尽量不用;及时释放

 

内存溢出

当程序运行需要的内存超过了剩余内存时,就会抛出这个错误(比如for循环弄个很大的数组对象)

内存泄漏

占用的内存没有及时释放、内存泄漏积累多了容易导致内存溢出

常见的内存泄漏:1.以外的全局变量、没有及时清理计时器或回调函数、闭包。

 

emm由于时间原因,函数部分暂时整理这么多吧,等后面学习再考虑添加

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值