1.函数声明
每次调用函数都会返回 Function
类型的实例。
//函数声明定义方式
function 函数名(值参数名, 默认参数名 = 默认值, ...剩余参数名) {
//函数体
}
//函数表达式定义方式
//命名函数
let Rectangle = function Rectangle2(值参数名, 默认值参数名 = 默认值, ...剩余参数名) {
//函数体
};
console.log(Rectangle.name);
//输出函数名称: "Rectangle2"
//未命名/匿名函数
let Rectangle = function(值参数名, 默认值参数名 = 默认值, ...剩余参数名) {
//函数体
};
console.log(Rectangle.name);
//输出函数名称: "Rectangle"
2.函数分类
2.1全局函数
名称 | 修饰符 |
全局函数 | —————— |
2.2成员方法
名称 | 修饰符 |
静态访问器属性(类) | static |
静态方法(类) | static |
实例访问器属性(类) | —————— |
实例方法(类) | —————— |
访问器属性(对象字面量) | —————— |
方法(对象字面量) | —————— |
2.3局部函数
名称 | 修饰符 |
嵌套函数 | —————— |
3.形参分类
名称 | 修饰符 |
值参数 | —————— |
默认值参数 | —————— |
剩余参数 | ... |
4.实参传递方式
值实参的数量无需等于值形参的数量,因为 JavaScript 函数的参数在内部表现为一个数组,函数被调用时总会接收一个数组,但函数并不关心这个数组中包含的实参的个数。
实参的类型与默认值形参的类型无需相同,但需要注意的是传递 null
实参不会赋予默认值。
实参的传递只支持按位置从左往右依次传递方式,不支持按命名传递方式。
实参的传递只支持按值传递方式,不支持按引用传递方式。
5.返回方式
按值返回。
6.返回值
参见 return
语句。
7.调用方式
//无实参
函数名();
//有实参
函数名(实参);
8.递归(Recursive)函数
调用自身的函数称为递归(Recursive)函数。
function loop(x) {
if (x >= 10) // "x >= 10" 是退出条件(等同于 "!(x < 10)")
return;
// 做些什么
loop(x + 1); // 递归调用
}
loop(0);
9.箭头(Arrow)函数
零个或多个参数时必须使用圆括号 ()
,只有一个参数时可省略圆括号 ()
。
函数体有多条语句时必须使用花括号 {}
,以及 return
语句。函数体只有一个 return
语句时,可省略花括号 {}
、 return
关键字以及 return
语句末尾的分号。
let 变量名 = (值参数名, 默认值参数名 = 默认值, ...剩余参数名) => {
//函数体
};
10.立即调用的函数表达式
立即调用的函数表达式(IIFE,Immediately Invoked Function Expression),又被称为立即调用的匿名函数。它类似于函数声明,但由于被包含在圆括号中,所以会被解释为函数表达式。紧跟在第一组圆括号后面的第二组圆括号会立即调用前面的函数表达式。
//未命名/匿名函数形式
(function(形参) {
//函数体
})(实参);
//箭头函数形式
((形参) => {
//函数体
})(实参);
11.函数作为值
函数不仅可以作为参数传递给另外一个函数,或者 还可以在函数中返回作为返回值的另一个函数。
只要满足其一,我们就可以将这种编程风格称为高阶函数风格(Higher Order Function Style),函数A称为高阶函数(Higher Order Function),函数B称为回调函数(Callback Function)。
//作为参数的函数只需要函数名称,不需要包含括号()
function 函数名称A(函数名称B) {
//函数体
}
function 函数名称A() {
return 函数名称B() {
//返回值函数体
};
}
12.闭包(Closure)
闭包是 JavaScript 中最强大的特性之一。JavaScript 允许函数嵌套,并且内部函数可以访问定义在外部函数中的所有变量和函数,以及外部函数能访问的所有变量和函数。
但是,外部函数却不能够访问定义在内部函数中的变量和函数。这给内部函数的变量提供了一定的安全性。
此外,由于内部函数可以访问外部函数的作用域,因此当内部函数生存周期大于外部函数时,外部函数中定义的变量和函数的生存周期将比内部函数执行时间长。当内部函数以某一种方式被任何一个外部函数作用域访问时,一个闭包就产生了。
let pet = function(name) { //外部函数定义了一个变量"name"
let getName = function() {
//内部函数可以访问外部函数定义的"name"
return name;
}
//返回这个内部函数,从而将其暴露在外部函数作用域
return getName;
};
myPet = pet("Vivie");
myPet();
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/javascript/javascriptlang/4731.html