函数
概念
函数即封装了一段可重复性使用的代码块,实现代码复用。
使用
声明函数
function 函数名(){
函数体
}
调用函数
函数名();
注意:
- 声明函数的关键字全部小写
- 声明函数最好用动词
- 函数不调用自己不执行
- 调用函数要加小括号
- 最好使用驼峰命名法
封装函数
把多个函数封装,对外只提供一个接口(相当于快递打包)。
参数
语法如下:
function 函数名(参数列表){
函数体
}
形参
声明函数时写在函数名右边小括号里的叫形参(形式上的参数)。
实参
调用函数时写在函数名右边小括号里的叫实参(实际上的参数)。
注意:
实参多于形参,正常调用,多的剔除。
形参少于实参,没有值的形参是undefined
,结果为NaN
。
返回值
Q:为什么函数需要返回值?
A:函数处理结果写死,无法灵活变通,为了能够让我们自主决定如何处理结果,因此让函数返回最终结果即可。
语法如下:
function 函数名(){
return 需要返回的结果;
}
函数名();
在函数体中使用 return
关键字能将内部的执行结果交给函数外部使用。
注意事项
-
return
语句后面的代码不会被执行,并且return
后面代码不会再被执行,所以return
后面的数据不要换行写// 封装一个计算两个数字的和和差的函数 function getAdd(a, b) { return a + b return a - b } document.write(getAdd(3, 2)) // 5
返回了第一个
return
的结果,后面不会被返回。 -
return
只能返回一个值(返回的结果是最后一个值)// 封装一个计算两个数字的和和差的函数 function getAdd(a, b) { return a + b, a - b } document.write(getAdd(3, 2)) // 1
返回了最后的结果。
-
如果想返回多个值可选择数组的方式
// 封装一个计算两个数字的和和差的函数 function getAdd(a, b) { return [a + b, a - b] } document.write(getAdd(3, 2)) // 5,1
返回两个结果,以数组的形式。
-
函数可以没有
return
,这种情况函数默认返回值为undefined
function getAdd(a, b) { a + b, } document.write(getAdd(3, 2)) // undefined
arguments
存储了传递的所有实参,展示形式是一个伪数组。
特性:
- 具有
length
属性 - 按照索引的方式进行存储
- 没有真正数组的一些方法。如
pop()
、push()
等function getSum() { console.log(arguments); // Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ] arguments.push(4) } getSum(1, 2, 3)
作用域
作用域定义
就是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性,且减少命名冲突。
作用域分类
作用域分类 | 特点 |
---|---|
全局作用域 | 整个 script 标签,或者是一个单独的 js 文件 |
局部作用域 | 在函数内部的作用域,这个代码的名字只能在函数内部起效果或作用(又被称为函数作用域) |
块级作用域 | 块作用域由 {} 包括, if 语句和 for 语句里面等 |
变量作用域
- 全局变量:全局作用域下的变量,全局都可使用(如果局部变量没有声明直接赋值,即没定义
let
,也会被看作全局变量)。 - 局部变量:函数内部的作用域,只能在函数内部使用(函数的形参也可以看作是局部变量)。
- 块级变量:只能在块作用域内访问,不能跨块访问。
注意:
若函数作用域内部或块级作用域内部没声明变量,直接赋值,则看成全局作用域,不建议这么做。
匿名函数
将匿名函数赋值给一个变量,并通过该变量名称进行调用,我们称这个为匿名表达式。
let fn = function(){
}
总结
今日错题
-
求
num
最后的结果。function test(num) { num = 100 num++ } let num = 10 test(num) console.log(num);
A.10
B.11
C.100
D.101
我的答案:D;正确答案:A
自我解析:最后要求在控制台打印的变量
num
是全局变量,而函数test()
里的num
为局部变量,且没return
返回出来,因此结果为10。 -
下图运行结果为
function getSum(x = 0, y = 0) { x + y } let res = getSum() console.log(res);
A.0
B.NaN
C.undefined
D.报错
我的答案:A;正确答案:C
自我解析:函数
getSum
没有return
返回结果。 -
代码运行结果为
function fn(x, y) { document.write(x + y) } fn(1, 2) console.log(x, y);
A.undefined
B.NaN
C.1,2
D.报错
我的答案:A;正确答案:D
自我解析:变量
x
和y
在函数内声明的,函数变量,全局作用域下没有这两个变量,因此报错。