JavaScript中函数回调、闭包、即时函数

JavaScript函数学习中遇到的几个难点:回调、闭包、即时函数;

 

一、回调

 

简单来说:回调就是将函数作为参数传入另一个函数中被其调用;

应用方式:

20180421185628403

back是一个函数,将back这个函数传入test函数中,被test函数调用,其中test称之为回调函数;

回调函数在调用时的的几种写法:

1.1传入函数名

20180421190841747

1.2直接将函数表达式写入参数中:

 

20180421192021863

 

 

二、闭包

 

说到闭包的话,不得不提在JavaScript中作用域的概念了,这个和Java的作用域概念不一样,在JavaScript中只有全局作用域、函数作用域;不存在块级作用域(ps:在es6中let、const这2个关键字声明的变量是块级绑定的);

 

1、全局作用域:在函数体外声明变量作用域都是全局作用域,或者在函数体中没有使用var的变量;

2、函数作用域:在函数体中用var声明的变量的作用域在该函数体中;

讲一点关于变量的提升

1.在所有使用var 关键字声明的变量才会有变量的提升,没有使用这个关键字声明的变量不会有变量的提升

2.变量提升到哪里?

变量提升到该变量的所在作用域的顶端,也就是说如果你的作用域是全局作用域,那么你的声明就被提升到最顶端了,在任何地方都可以使用该变量,而不会报not defined 的错了;

如果是函数范围作用域:那就提升到该函数的最顶端;(如果有疑惑的地方自行做实验)

注意:提升的只是声明,而不是赋值操作;只提升了声明部分,赋值并没有提升;

举个例子说明一下这个问题;

20180421202655693

再来看下,块级作用域是否存在;例子

20180421204929957

没有用var关键字的变量是否可以变量的提升(答案显而易见的,变量的提升只针对声明):

20180421205520938

 

回到正题什么是闭包???

闭包定义:

闭包是一个函数在创建时允许该自身函数访问并操作该自身函数之外的变量时所创建的作用域。有点绕口,

换句话说:闭包可以访问所有的变量或函数,只要这些函数和变量存在于该函数声明时的作用域内就行;

举个例子~~

201804212117535

这就是一个简单的闭包;

为什么在test方法执行完成之后,私有变量innerValue的值还能保存,其实就是因为有一个全局变量的引用了gg函数,而gg函数又引用了innerValue,所以才导致innerValue的值没有被回收;

 

三、即时函数

构造有两种:

20180421213450984

我们来看第一种写法:

实际上这个即使函数分为2部分:第一部分是函数表达式,第二部分是函数操作符;

 

举个例子:

20180421214019861

我们调用函数就是:函数名+操作符;

即时函数就是:函数表达式 +操作符;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值