JavaScript 函数

优质
小牛编辑
130浏览
2023-12-01

在 JavaScript中,函数是头等 (first-class) 对象,因为它们可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于函数可以被调用。简而言之,它们是 Function 对象。(MDN)

函数就是一段代码片段,调用函数就是执行函数中的代码。

1. 函数的使用

1.1 语法

函数使用前通常与变量一样需要先进行声明,用 function 关键字定义函数。

// 常见的函数的定义方式
function 函数名(参数1, 参数2, ...) {
  代码片段;

  return 返回值;
}

// 调用函数 (执行函数中的代码)
var 函数的返回值 = 函数名(参数1, 参数2, ...);
  • 调用函数就是执行函数中的代码
  • 参数是调用函数的时候传递过去的,在函数执行过程中可以访问到
  • 函数执行完毕后可以有一个返回值,调用函数的地方可以接收到这个返回值

1.2 调用函数

使用 函数名() 的方式即可调用一个函数

以下是一个最简单的函数:

function say() {
  console.log('hello');
}

say(); // 输出:"hello"

调用这个函数就会在控制台输出 hello 字符串。

这个函数没有返回值,默认会返回一个 undefined

1.3 带有参数与返回值的函数

在声明函数的时候,可以对参数也做上说明

假设有一个需求,需要一个计算三角形周长的函数

计算三角形周长则需要知道三角形三条边各自的长度,然后将他们求和。

定义函数的时候就可以将三条边作为参数进行声明。

function calcPerimeter(a, b, c) {
  // a, b, c 分别代表三条边
  var sum = a + b + c;

  return sum;
}

// 调用函数 并将返回值赋值给perimeter
var perimeter = calcPerimeter(3, 4, 5);

在调用函数的时可以传递值过去,这些值可以在函数中被访问。

在以上 calcPerimeter 函数被调用的时,传递了 3, 4, 5 三个值。

三个值对应到函数声明时定义的三个参数 a, b, c

所以函数执行过程中 sum 的值为 3 + 4 + 5,即 12,随后 sum 被作为返回值进行返回。

最终变量 perimeter 也会被赋值为12。

2. 怎么运用函数

2.1 合理包装内容

函数可以对代码进行封装,让逻辑更加清晰。

比如如下代码块:

// 改写前
var num = 10;

var flag = false;

var i;
var len;
for (i = 2, len = num - 1; i <= len; i++) {
    if (num % i === 0) {
        flag = true;
        break;
    }
}

console.log(flag);

以上代码第一眼可能无法看出具体在做什么,仅需要做一点修改,就能有所改善。

// 改写后
function isPrimeNumber(num) {
  var flag = false;
  
  var i;
  var len;
  for (i = 2, len = num - 1; i <= len; i++) {
    if (num % i === 0) {
      flag = true;
      break;
    }
  }

  return flag;
}


var num = 10;

var result = isPrimeNumber(num);

console.log(result);

改写后的代码似乎多了几行,但是将其中核心部分包装成了函数。

通过 isPrimeNumber 函数名可以很容易的了解到这一段代码作用是用来判断一个数是否为质数

当然有个前提就是起一个信达雅的函数名。

2.2 优秀的函数名

优秀的函数名可以帮助他人更容易理解代码,同时当自己一段时间后再回头看代码时,能更容易进入当时写代码时候的思维模式等。

这里提供几个函数命名的建议,具体的命名可以根据团队规范、个人成长等做调整。

2.2.1 拼写准确

准确的拼写十分重要,绝大多数情况下函数名都会是英文单词组成的。

当然许多时候手一快可能就少了一个字母,或者错将 wrap 进行乾坤大挪移拼写成了 warp

许多情况是无法避免的,经常需要自检。

当然可以借助一些单词的检查插件,如 Visual Studio Code 可以借助 Code Spell Checker 插件来检查单词的正确性。

再者碰到想起的函数名但是单词拼写不出来,尽可能翻词典,日积月累能有大量的词汇沉淀。

2.2.2 尽量不使用拼音或者混用拼写

尽量不要使用拼音或者是首字母缩写。

以下函数名或许会造成困扰:

function jslsh() {}

function jsNumber() {}

以上是计算两数和函数的命名,可能只有天和地知道这个是什么意思。

当然,如果是自己写 demo 或者测试代码的时候,其实不需要考虑这么多。

2.2.3 有“状态”的函数名

如碰到函数功能是判断是否有没有可以的时候,可以带上一些前缀,比如:

// 是否登入
function isLogin() {}

同时可以合理的使用动词,比如打开文件就可以使用 openFile 函数名,具体的状态可以根据语境、函数作用、个人习惯等做调整使用。

2.2.4 合理使用缩写

使用词语的缩写尽量使用通用的缩写

如:

  • pwd - password
  • mgr - manager
  • del - delete

这些缩写大部分开发者是可以看的懂的缩写。

3. 函数示例

3.1 计算圆的面积

分析:根据圆面积公式 S=π·r·r,其中 S 就是要求的值,即函数的返回值,π 是常量(固定的一个值),半径r是未知数,所以r就可以设计成参数

function circleArea(r) {
    var pi = 3.1415926;

    return pi * r * r;
}

// 计算半径为10的圆的面积
var area = circleArea(10);

3.2 判断某个DOM元素是否含有某个类名

分析:

某个DOM某个类名可以说明有两个未知量,可以设计成两个参数。

根据描述也可以确定一个 某个DOM 的类型是个 DOM 对象,某个类名是个字符串

只要拿到这个DOM的 class 属性,判断里面是不是含有这个类型即可得到结果

function hasClass(el, className) {
  // el 是 element的缩写,表示一个dom元素
  
  // 如果没有元素 则返回
  if (!el) {
      return false;
  }

  // 根据空格分割成数组
  // 可以不使用 split 方法,使用字符串也可以用indexOf匹配
  var classList = el.className.split(' ');

  // 判断是否存在
  if (classList.indexOf(className) >= 0) {
      return true;
  }
  
  return false;
}

4. 函数的其他知识

以下扩展内容可能需要一定的知识积累,遇到不懂的地方可以停下脚步,先学习下一章节

4.1 函数表达式

以上篇幅的函数其实都通过函数声明的方式来定义,还有一种方式就是使用函数表达式定义函数。

// 函数声明
function add(a, b) {
    return a + b;
}

// 函数表达式
var add = function(a, b) {
    return a + b;
};

通过上述例子可以看出写法上的区别就是函数表达式是将函数赋值给了变量。

这两种方式创建的函数最大的区别在于,不能提前调用使用函数表达式创建的函数

光看句子有点抽象,举个例子