1.7JavaScript语言的函数(Function)

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

(0)
上一篇 2020年8月6日
下一篇 2020年8月8日

相关推荐

  • 2.6JavaScript引用类型之映射(Map)

    1.映射声明 与对象只能使用字符串、数字或符号作为键不同,映射可以使用任何 JavaScript 数据类型作为键。与对象一样,映射的值可以是任何数据类型。 2.访问映射 3.获取映射长度

  • 2.1JavaScript语言的ES6 Module

    1.目录结构 模块就是一个以 .js 扩展名结尾的文件。 与 <script type=”module”> 关联或通过 import 语句导入或通过 export 语句导出的 JavaScript 文件都会被认为是模块文件。 在以下示例中,模块文件为 main.js、canvas.js、square.js。…

  • 2.9JavaScript引用类型之生成器(Generator)

    生成器对象也实现了 Iterable 接口。 1.生成器函数声明 定义生成器函数只需要在普通函数名称前面加一个星号(*),只要是可以定义函数的地方(不支持箭头函数),就可以定义生成器。 标识生成器函数的星号不受两侧空格的影响。 2.yield yield 关键字用来多次暂停和恢复一个生成器函数,它可以被认为是…

发表回复

登录后才能评论