当前位置: 首页 > news >正文

【JavaScript】七、函数

文章目录

  • 1、函数的声明与调用
  • 2、形参默认值
  • 3、函数的返回值
  • 4、变量的作用域
  • 5、变量的访问原则
  • 6、匿名函数
    • 6.1 函数表达式
    • 6.2 立即执行函数
  • 7、练习
  • 8、逻辑中断
  • 9、转为布尔型

在这里插入图片描述

1、函数的声明与调用

function 函数名(形参列表) {
	函数体
}

eg:

// 声明
function sayHi() {
	console.log('Hello World!')
}

// 调用
sayHi()

在这里插入图片描述

注意:

  • 形参不需要带类型

  • 两个相同的函数后面的会覆盖前面的函数

  • 参的个数和形参的个数可以不一致,形参过多,默认给undefined,实参过多,多余的实参会被忽略 (函数内部有一个arguments,里面装着所有的实参)

在这里插入图片描述

命名规范:

  • 和变量命名基本一致

在这里插入图片描述

  • 尽量小驼峰式命名法
  • 前缀应该为动词

在这里插入图片描述

2、形参默认值

<body>
  <script>
    function getSum(num1, num2) {
      document.write(num1 + num2)
    }
    // 3
    getSum(1, 2)
    // NaN
    getSum()
  </script>
</body>

如上,形参不传值,计算结果是NaN,形参也是一个变量,不给值,则是undefined,undefined + unfined = NaN,改进下:

function getSum(num1 = 0, num2 = 0) {
	document.write(num1 + num2)
}

形参默认值只会在缺少实参参数传递时才会被执行

// 练习:数组求和函数
<body>
  <script>
    function getArrSum(array = []) {
      let sum = 0
      for (let i = 0; i < array.length; i++) {
        sum = sum + array[i]
      }
      console.log(sum)
    }
    getArrSum([1, 2, 3, 4, 5])
    getArrSum()
  </script>
</body>

3、函数的返回值

function getSum(num1, num2) {
	return num1 + num2
}
  • return结果给调用者
  • return 后面代码不会再被执行
  • return函数可以没有return语句,此时,默认返回undefined
function getSum(num1, num2) {
	num1 + num2
}

// 调用一个没有返回结果的函数,查看调用结果
console.log(getSum(1, 2))	//undefined

在这里插入图片描述

练习: 求一个数组的最大值

<body>
  <script>
    function getMax(array = []) {
      let max = array[0]
      for (let i = 1; i < array.length; i++) {
        if (max < array[i]) {
          max = array[i]
        }
      }
      return max
    }

    console.log(getMax([1, 3, 4, 6, 9]))

  </script>
</body>

4、变量的作用域

在这里插入图片描述

作用域:

在这里插入图片描述

对应的,变量分为:全局变量和局部变量

在这里插入图片描述

<body>
  <script>
    // 全局变量
    let num = 0

    // 函数中可以用
    function getNum() {
      return num
    }

    // 函数外面也能用
    console.log(num)
  </script>
</body>
<body>
  <script>
    function doSome() {
      // 局部变量
      let i = 1
      return i
    }

    // 局部变量,函数外不可用,报错i is not defined
    console.log(i)
  </script>
</body>

最后,作用域有一个坑:如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐

<body>
  <script>
    function doSome() {
      // 不声明,直接赋值
      num = 1
    }

	// 调用一下
    doSome()

    // 1,访问成功
    console.log(num)
  </script>
</body>

5、变量的访问原则

如下,输出是20,首先两个num作用域不同,并不冲突,其次,console.log打印时,num就近

在这里插入图片描述

访问原则:

  • 在能够访问到的情况下 先局部, 局部没有在找全局,遵循就近原则
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域

在这里插入图片描述

6、匿名函数

在这里插入图片描述
函数定义完需要调用,匿名函数没有名字,因此不能像具名函数一样通过名字调用,其调用方式有两种:

  • 函数表达式
  • 立即执行函数

6.1 函数表达式

语法是将匿名函数赋值给一个变量
在这里插入图片描述

<body>
  <script>
    let fn = function(num) {
      console.log('函数表达式的方式')
    }
    // 调用
    fn(1)
  </script>
</body>

这种写法很像常规的具名函数定义,但有区别:

在这里插入图片描述
在这里插入图片描述

也就是说,具名函数的调用,可以写在任何位置,而匿名函数用函数表达式来调用是不行的,因为函数表达式是一个let,最后,匿名函数的使用场景举例:在Web API中

在这里插入图片描述

在这里插入图片描述

6.2 立即执行函数

写法:拿个小括号包着匿名函数,最后再加个空的小括号,第二个小括号是在做调用,因此,这个函数一定义,匿名函数就立马被执行了,因此,叫立即执行函数

在这里插入图片描述

封号也可以写前面,以下两种写法都行:

<body>
  <script>
    (function () {
      console.log(1)
    })();

    (function () {
      console.log(2)
    })();
    
  </script>
</body>
// 封号写前面
<body>
  <script>
    ; (function () {
      console.log(1)
    })()

      ; (function () {
        console.log(2)
      })()

  </script>
</body>

立即执行函数还有个作用:防止变量污染

在这里插入图片描述

再体会下,上面说的第二个小括号是在做调用

<body>
  <script>
    (function (x, y) {
      console.log(x + y)
    })(1, 3);

  </script>
</body>

匿名函数的立即执行函数写法,还有一种写法,小括号里面包着匿名函数 + 一个空的小括号

在这里插入图片描述

最后,多个立即执行函数要用 ; 隔开,要不然会报错。未来其使用场景如:

在这里插入图片描述

立即执行函数也可以有函数名,如下,写成立即执行函数,一来不用再特地调用,二来,这个JS文件被引入后,即使JS中定义了变量,也不会引起变量污染

在这里插入图片描述

7、练习

需求: 用户输入秒数,可以自动转换为时分秒

<body>
  <script>
    function convertTime(totalSecond = 0) {
      let hour = parseInt(totalSecond / 60 / 60 % 24)
      let minute = parseInt(totalSecond / 60 % 60)
      let second = parseInt(totalSecond % 60)
      // 补0,让1小时变成01小时
      hour = hour < 10 ? '0' + hour : hour
      minute = minute < 10 ? '0' + minute : minute
      second = second < 10 ? '0' + second : second
      return `${hour}${minute}${second}`
    }
    let totalSecond = +prompt('输入总秒数')
    document.write(convertTime(totalSecond))
  </script>
</body>

此外,hour = hour < 10 ? '0' + hour : hour其实也体现了JS的弱类型,hour本身是数字型,最后重新赋值可能是一个String型,也没报错

8、逻辑中断

通过左边能得到整个式子的结果,因此没必要再判断右边,即短路

在这里插入图片描述

// 都是真,返回最后一个真值
console.log(11 && 22)	//22

//逻辑或,返回最后一个真值
console.log(11 || 22)	//11

下面这个写法,和给形参给默认值,效果一样,x和y不传时,为undefined,当false看,做逻辑与,就是0,最后结果为0 + 0

在这里插入图片描述

未来短路运算的使用场景:

在这里插入图片描述

注意⚠️,和Java不同,JS的短路与和短路或 操作符返回的是操作数的值,而不是布尔值(true 或 false)

9、转为布尔型

显示转换语法:

Boolean(内容)

''、0、undefined、null、false、NaN 转换为布尔值后都是false, 其余则为 true

console.log(Boolean('hahhah'))  //true
console.log(Boolean(0))         //false
console.log(Boolean(NaN))       //false
console.log(Boolean(111))       //true

有了这个前提,再看

// null
console.log(null && 20) 

null当false看,那短路,结果是null,注意,返回是null,我没加Boolean,下面这个返回才是false

//false
console.log(Boolean(null) && 20) 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/94236.html

相关文章:

  • Spring集成Web环境搭建
  • 什么是LangChain,为什么我们选择使用LangChain,以及它的典型应用场景
  • HCIE-day15-L3VPN
  • 练习:求平方根
  • mysql数据恢复 深度扫描碎片 智能给出恢复建议并执行恢复操作
  • 【Python实用技巧】OS模块详解:文件与目录操作的瑞士军刀
  • 前端性能优化:深入解析哈希算法与TypeScript实践
  • 揭开顺序表的神秘面纱,探索数据结构的精髓
  • Vue2项目打包后,某些图片被转换为base64导致无法显示
  • 股票App开发第一步:如何免费快速的获取股票数据(如何免费获取金融数据)
  • 将网络安全和第三方风险管理与业务目标相结合
  • c++编写拉格朗日插值
  • 1.25-20GHz/500ns超快跳频!盛铂SWFA300国产捷变频频率综合器模块赋能雷达/5G/电子战高频精密控制 本振/频综模块
  • Elasticsearch:理解政府中的人工智能 - 应用、使用案例和实施
  • 深入探索C++:从基础到实践
  • Nacos Console 模块的作用是什么?是如何与 Server 端交互的?
  • 大数据专业毕业设计选题推荐:实用课题推荐
  • 基于 Redhat 9.5 的 LVS 负载均衡架构下 Nginx 服务器的部署与连通性实验
  • python.pandas.day17
  • Linux--命令行操作
  • AI for CFD入门指南(传承版)
  • centOS 7.9 65bit 修复Openssh漏洞
  • 使用QT画带有透明效果的图
  • 魔法原子,以全栈自研撬动人形机器人通用化未来
  • 【免费分享】PSO-BP特征重要性分析matlab语言
  • BFS解决最短路径问题(使用BFS解决最短路径问题的黄金法则)
  • Python生成整数序列之 range()函数
  • 《C++11:bind绑定器与function包装器》
  • Kotlin when 表达式完全指南:从基础到高级的12种实战用法
  • Redis的深入了解