特殊函数
匿名函数
JavaScript可以将函数作为数据使用。作为函数本体,它像普通的数据一样,不一定要有名字。默认名字的函数被称之为匿名函数。如下示例:
function(a){return a;}
匿名函数的两种用法:
- 可以将匿名函数作为参数传递给其他函数。这样,接收方函数就能利用所传递的函数来完成某些事情。
- 可以定义某个匿名函数来执行某些一次性任务。
/*
匿名函数 - 表示没有名称的函数
* 问题 - JavaScript语法并不支持匿名函数
* 应用
* 回调函数 - 将一个函数作为另一个函数的参数使用,作为参数的函数
* 自调函数 - 函数调用自身(定义即调用的函数)
*/
//直接运行匿名函数时报错
function () {
console.log('today is a sunny day')
}
1、回调函数
当一个函数作为参数传递给另一个函数时,作为参数的函数被称之为回调函数。
(1)不带参数的回调函数
// 函数n作为函数fn的参数->回调函数
var n = function () {
console.log('n');
}
function fn(v) {
v();
}
fn(n);
// 匿名回调函数 - 不占用全局命名空间(内存)
fn(function () {console.log('n')})
解析图如下所示:
(2)带参数的回调函数
// 函数n作为函数fn的参数->回调函数
var n = function (w) {
console.log(w);
}
function fn(v) {
v('function');
}
fn(n);//function
// 匿名回调函数 - 不占用全局命名空间(内存)
fn(function (w) {console.log(w)})//function
解析图如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NHMHpMUl-1603723317256)(http://lk.wangshmily.top/PicGo/带参数的回调函数.png)]
2、自调函数
概念:
所谓自调函数就是在定义函数后自行调用。
作用:
用于执行一次性的逻辑任务。
应用:
作为整体逻辑代码外层结构。
语法结构:
- 第一个括号用来定义函数
- 第二个括号用来调用函数
如下代码展示了两种写法:
第一种:
// 1、语法结构
//(定义函数)(调用函数)
(function (v) {
var w = 100;//局部变量
console.log('this is '+ v);
})('function');
第二种:
// 2、表达式方式
(function (v) {
var w = 100;//局部变量
console.log('this is '+ v);
}('function'));
注:自调函数写法不止这两种,此处举例两种比较常用的写法。
拓展:
有个问题:自调函数定义时写上函数名会不会报错?调用会不会报错?
如下代码解释该问题:
//1、定义时加上函数名,输出结果不变,没影响
(function fn() {
console.log('js')
})()//输出 js
//2、定义时加上函数名,使用函数名调用,输出报错,有影响。
(function fn() {
console.log('js')
})()
// fn(); 报错,报错信息:ReferenceError: fn is not defined