JavaScript中函数回调、闭包、即时函数
JavaScript函数学习中遇到的几个难点:回调、闭包、即时函数;
一、回调
简单来说:回调就是将函数作为参数传入另一个函数中被其调用;
应用方式:
back是一个函数,将back这个函数传入test函数中,被test函数调用,其中test称之为回调函数;
回调函数在调用时的的几种写法:
1.1传入函数名
1.2直接将函数表达式写入参数中:
二、闭包
说到闭包的话,不得不提在JavaScript中作用域的概念了,这个和Java的作用域概念不一样,在JavaScript中只有全局作用域、函数作用域;不存在块级作用域(ps:在es6中let、const这2个关键字声明的变量是块级绑定的);
1、全局作用域:在函数体外声明变量作用域都是全局作用域,或者在函数体中没有使用var的变量;
2、函数作用域:在函数体中用var声明的变量的作用域在该函数体中;
讲一点关于变量的提升:
1.在所有使用var 关键字声明的变量才会有变量的提升,没有使用这个关键字声明的变量不会有变量的提升
2.变量提升到哪里?
变量提升到该变量的所在作用域的顶端,也就是说如果你的作用域是全局作用域,那么你的声明就被提升到最顶端了,在任何地方都可以使用该变量,而不会报not defined 的错了;
如果是函数范围作用域:那就提升到该函数的最顶端;(如果有疑惑的地方自行做实验)
注意:提升的只是声明,而不是赋值操作;只提升了声明部分,赋值并没有提升;
举个例子说明一下这个问题;
再来看下,块级作用域是否存在;例子
没有用var关键字的变量是否可以变量的提升(答案显而易见的,变量的提升只针对声明):
回到正题什么是闭包???
闭包定义:
闭包是一个函数在创建时允许该自身函数访问并操作该自身函数之外的变量时所创建的作用域。有点绕口,
换句话说:闭包可以访问所有的变量或函数,只要这些函数和变量存在于该函数声明时的作用域内就行;
举个例子~~
着就是一个简单的闭包;
为什么在test方法执行完成之后,私有变量innerValue的值还能保存,其实就是因为有一个全局变量的引用了gg函数,而gg函数又引用了innerValue,所以才导致innerValue的值没有被回收;
三、即时函数
构造有两种:
我们来看第一种写法:
实际上这个即使函数分为2部分:第一部分是函数表达式,第二部分是函数操作符;
举个例子:
我们调用函数就是:函数名+操作符;
即使函数就是:函数表达式 +操作符;