JavaScript 第四天
JavaScript 基础第四天 — 函数 作用域 作用域链
1. 函数 function
- function 执行特定任务的代码块
- 可实现代码复用, 提高开发效率
- 函数和循环区别: 随时调用, 随时执行, 可重复调用
- 函数可把相同逻辑代码包裹起来, 通过函数调用执行包裹的代码, 有利精简代码方便复用
- 和变量命名基本一致, 使用小驼峰命名法, 前缀应为动词
1. 函数声明语法
1 | function 函数名 { |
2. 函数调用与使用
- 函数不调用 自己不执行, 使用()调用函数
- 曾使用的alert()、parseInt()后面跟小括号的本质都是函数的调用
1
2
3// 函数一次声明可多次调用 每一次调用函数 代码都会重新执行一次
say()
say() - 循环代码写完即执行,不能方便控制执行位置
- 函数体是函数的构成部分, 它负责把代码包裹起来, 直到函数调用时函数体代码才会执行
1 | function say() { // say是函数名 |
3. 99乘法表封装到函数里, 调用1次
1 | function say() { |
4. 封装一个函数, 计算1~100之间的和
1 | function say() { |
2. 函数传参
- 若函数完成功能需调用者传入数据, 就需用函数传参
- 调用函数时, 传几个数据就写几个, 用逗号隔开
- 提高函数灵活性, 函数分为形参和实参
1 | function say(num1, num2) { // () 参数列表 |
1. 形参和实参
- 形参: 声明函数时写在函数名右括号叫形参 (形式上参数)
- 实参: 调用函数时写在函数名右括号叫实参 (实际上参数)
- 形参可理解为函数内声明变量,实参可理解为变量赋值
- 开发中需保持形参和实参个数一致
- 曾使用过alert, parseInt, number本质上都是函数调用传参
2. 函数封装求和
1 | // 利用逻辑中断 形参不赋值, 则是undefined |
3. 函数封装求学生总分
1 | function say(num1) { |
3. 函数返回值
- 函数缺点: 把计算结果处理写死了, 内部处理了
- 当调用函数, 函数会返回结果, 这就是有返回值的函数
- 函数执行后得到结果,结果是调用者要拿到的
- 很多函数具备返回值(prompt, parseInt)
- 这些函数是JS底层内置的, 直接可使用, 有的函数, 没有返回值, 根据需求, 来设定返回值
1. return返回数据:
- 函数需返回数据时, 用return 来返回值
- return会立即结束当前函数, 将内部结果交给函数外使用
- 函数内只能1次return, 并且return后面代码不会被执行, 所以return后面数据不要换行写
- 函数可以没有return, 这种情况函数默认返回值为undefined
1 | function say() { |
- 求任意数组中最大值 并返回最大值
1 | function say(num1) { |
- 求任意2个数的最大值 并返回
1 | function say(num1, num2) { |
4. 作用域
- 作用域的使用提高逻辑局部性, 增强程序可靠性,减少名字冲突
- 代码中用到的名字并不总有效可用, 而限定名字可用性代码范围叫作用域
- 全局作用域: 函数外部或整个Script 有效
- 局部作用域: 函数内部有效, 也叫函数作用域
- 块级作用域: { }内有效, if和for里的{ } 等…
1. 变量作用域
- 全局变量: 函数外部let的变量–任何区域都可访问修改
- 局部变量: 函数内部let的变量–局部变量只能在当前函数内部访问修改
- 块级变量: {}内部let变量–只能在块作用域访问, 不能跨块、跨函数访问
2. 变量作用域两个坑, 特殊情况
- 函数内部或块作用域内部, 变量没声明直接赋值, 也当全局变量看, 不推荐
- 函数内部形参可看做局部变量
5. 作用域链
作用域链:采取就近原则方式来查找变量最终值
只要是代码, 至少有一个作用域
函数中还有函数, 那这个作用域又可诞生一个作用域
根据内部函数可访问外部函数变量机制, 用链式查找决定数据能被内部函数访问叫 作用域链
下面最终结果是几?
1 | function fn() { |
- 下面最终结果是几?
1 | let a = 1 |
6. 匿名函数
- 将函数赋值给变量, 并通过变量名调用叫函数表达式
- 匿名函数形参和实参使用跟具名函数一样
- 函数分为: 具名函数, 匿名函数
1 | let num = function () { |
7. 立即执行函数
- 避免全局变量之间的污染
- 无需调用, 立即执行, 本质已调用了
- 多个立即执行函数要用 ; 隔开,不然报错
1 | // 第一种写法 |
- 用户输入时间后 转换时间
1 | let num1 = +prompt('请输入总秒数') |
本节单词:
- function
- return
- arguments
- parseInt
- say、get、can、has、is、set、load
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小城故事!
评论