3.10JavaScript语言的函数(Function)和闭包(Closure)

1.函数定义

函数遵循标识符的命名规则,一般camelCase命名法。

函数实际上是对象,每个函数都是Function类型的实例。

1.1函数声明定义法

function name(参数1, 默认值参数2 = 值, ...剩余参数) {
  statements;
}

1.2函数表达式定义法

name函数名称,可被省略。

let function_expression = function [name](参数1, 默认值参数2 = 值, ...剩余参数) {
  statements;
};

1.3函数声明与函数表达式的区别

  • 函数声明末尾没有分号,函数表达式末尾有分号
  • 函数声明支持函数声明提升(function declaration hoisting),函数表达式不支持函数声明提升

2.参数传递方式

JavaScript函数的参数在内部表现为一个数组,函数被调用时总会接收一个数组。

  • 参数的传递仅支持位置参数从左往右依次传递方式,不支持命名参数传递方式。
  • 函数调用时传递的参数个数与函数定义时接收的参数个数无需相同。
  • 函数调用时传递的参数数据类型与函数定义时默认参数的数据类型无需相同。

3.箭头函数表达式(Arrow Function)

箭头函数表达式的语法比函数表达式更简洁,箭头函数表达式更适用于那些本来需要嵌套匿名函数的地方。

let function_expression = ([param1[, param2[, ..., paramN]]]) => { statements; };

4.递归

一个函数可以指向并调用自身,便形成了递归。

function loop(x) {
  if (x >= 10) // "x >= 10" 是退出条件(等同于 "!(x < 10)")
    return;
  // 做些什么
  loop(x + 1); // 递归调用
}
loop(0);

5.闭包

闭包是 JavaScript 中最强大的特性之一。JavaScript 允许函数嵌套,并且内部函数可以访问定义在外部函数中的所有变量和函数,以及外部函数能访问的所有变量和函数。

但是,外部函数却不能够访问定义在内部函数中的变量和函数。这给内部函数的变量提供了一定的安全性。

此外,由于内部函数可以访问外部函数的作用域,因此当内部函数生存周期大于外部函数时,外部函数中定义的变量和函数的生存周期将比内部函数执行时间长。当内部函数以某一种方式被任何一个外部函数作用域访问时,一个闭包就产生了。

let pet = function(name) {          //外部函数定义了一个变量"name"
  let getName = function() {            
    //内部函数可以访问外部函数定义的"name"
    return name; 
  }
  //返回这个内部函数,从而将其暴露在外部函数作用域
  return getName;               
};
myPet = pet("Vivie");
    
myPet();                  

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/basic/js/4731.html

发表评论

登录后才能评论