目录
1.函数定义
函数实际上是对象,每个函数都是Function类型的实例。
1.1函数声明定义法
function name(值参数, 默认值参数 = 值, ...剩余参数) {
statements;
}
1.2函数表达式定义法
name
函数名称,可被省略。 又被称为匿名函数。
let function_expression = function [name](值参数, 默认值参数 = 值, ...剩余参数) {
statements;
};
1.3函数声明与函数表达式的区别
- 函数声明末尾没有分号,函数表达式末尾有分号
- 函数声明支持函数声明提升(function declaration hoisting),函数表达式不支持函数声明提升
2.参数传递方式
JavaScript函数的参数在内部表现为一个数组,函数被调用时总会接收一个数组。
- 参数的传递仅支持位置参数从左往右依次传递方式,不支持命名参数传递方式。
- 函数调用时传递的参数个数与函数定义时接收的参数个数无需相同。
- 函数调用时传递的参数数据类型与函数定义时默认参数的数据类型无需相同。
关于值传递还是引用传递,取决于传递的参数是值类型还是引用类型,值类型对局部变量的修改不会反映到函数外部,而引用类型对局部变量的修改会反映到函数外部。
3.箭头函数表达式(Arrow Function)
箭头函数表达式的语法比函数表达式更简洁,箭头函数表达式更适用于那些本来需要嵌套匿名函数的地方。
let function_expression = ([param1[, param2[, ..., paramN]]]) => { statements; };
4.重载
JavaScript不支持重载,如果定义了两个同名函数,则后定义的会覆盖先定义的。可以通过检查参数的类型和数量,然后执行不同的逻辑来模拟函数重载。
5.递归
一个函数可以指向并调用自身,便形成了递归。
function loop(x) {
if (x >= 10) // "x >= 10" 是退出条件(等同于 "!(x < 10)")
return;
// 做些什么
loop(x + 1); // 递归调用
}
loop(0);
6.闭包
闭包是 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