什么是js函数
了解函数
函数是我们的一个数据类型,和数学的一次函数没有关系,函数是我们接触的第一个复杂数据类型
函数的作用就是把一段功能性代码放在一个 “盒子” 里面, 什么时候想用的时候, 直接把 “盒子” 里面的代码拿出来用就可以了
例子: 微波炉
把一个加热的功能放在了一个铁盒子里面, 只要你想加热东西的时候, 把微波炉开关打开, 就能把你放进去的内容加热
代码
就是我们在内存中开辟一个小空间, 把我们的代码放进去,然后给这个空间起一个名字, 叫做 xxx,以后我只要需要用到这个空间里面的代码的时候,把 xxx空间里面的代码执行一下
函数的创建
声明式函数
语法:
function 名字 () {}
function就是声明函数的关键字
函数名:就是你给这一段空间自定义一个名字,命名规则,规范和变量名一样
():存放参数的位置
{}:存放一段代码的位置
赋值式函数
语法:
var 名字= function () {}
var: 定义变量的关键字
名字: 就是我们给这个函数起的一个自定义名称
=: 赋值
function: 表示一个函数
(): 写参数的位置
{}: 存放一段代码的位置
函数的调用
不管哪种方式定义的函数, 他们的调用方式是一样的
调用语法:函数名()
函数名: 你要让哪个函数里的代码执行
(): 就是调用的意思
function demo1(){
console.log('我是声明式函数');
}
var demo2= function () {
console.log('我是赋值式函数');
}
demo1();
demo2();
调用时机的区别
当你调用一个函数的时候, 方式都是一样的,但是调用的时机, 取决于你使用哪种方式定义函数
声明式函数,可以在声明之前调用,也可以在声明之后调用
但是赋值式函数只能在声明之后调用,否则会报错
demo1();//正常调用
function demo1(){
console.log('我是声明式函数');
}
demo1();//正常调用
demo2();//报错,demo2 is not a function,意思是demo2不是一个方法
var demo2= function () {
console.log('我是赋值式函数');
}
demo2();//正常调用
函数的参数
形参
就是写在函数定义时候的 () 里面的
可以写多个, 多个的时候中间用 逗号(,) 分隔
就是一个只能在函数内部使用的变量
至于这个变量(形参) 的值是什么, 由函数的实参决定
实参
就是写在函数调用的时候的 () 里面的
可以写多个, 多个之间使用 逗号(,) 分隔
是一个准确的数据
用来给对应的形参赋值的
function demo (形参) {}//用来接收实参的值
demo(实参);//用来给形参赋值的
//多个参数
function demo (a,b,c) {
console.log(a);//小明
console.log(b);//男
console.log(c);//20
}
demo('小明','男',20);
参数的个数关系
-
形参和实参一样多
按照从左到右的顺序一个一个进行赋值 -
形参比实参多
前面的一个一个对应的关系, 多出来的形参, 没有实参进行赋值
在函数内部使用的时候, 就是一个没有赋值的变量, 就是 undefined -
实参比形参多
前面的一个一个对应的关系, 多出来的实参, 在函数内部没有形参接收
相当于你白写了多出来的实参, 在函数内部不能直接使用
//参数一样多
function demo1(a, b) {
console.log(a);
console.log(b);
}
demo1(10,20);
// 形参多
function demo2(a, b, c) {
// 在这个函数里面, c 就相当于定义了一个变量, 但是没有被赋值
console.log(a);
console.log(b);
console.log(c);// c 在使用的时候就是 undefined
}
demo2(10,20);
// 实参多
function demo3(a, b, c) {
// 我在这里不能直接使用传递进来的 40 50 60
// 但是不会报错
console.log(a);
console.log(b);
console.log(c);
}
demo3(10,20,30,40,50,60);
补充知识:arguments
函数内部的一个特殊的变量, arguments
在每一个函数内部, 都有一个天生的变量
不需要我们去定义, 直接就能拿来使用
这个变量叫做 arguments
表示所有实参的集合
详解 arguments
会把所有的实参按照从左到右的顺序依次排好
给每一个实参一个编号(索引 / 下标)
这个编号(索引 / 下标) 是从 0 开始的, 依次递增
当你需要获取到这里面的某一个的时候
你只要写 arguments[编号] 就能得到某一个准确的值
length
arguments 还有一个属性叫做 length
表示 arguments 这个集合的长度, 也就是里面有多少个数据
值是一个 number 数据类型的数字
如果你想得到这个属性就写 arguments.length
循环遍历arguments
使用循环遍历整个 arguments 获取到每一个数据
因为 arguments 的索引(下标) 是按照从 0 开始依次叠加的顺序
我们的循环刚好也可以给我提供一组有规律的数字
所以我们可以使用循环的方式来遍历 arguments
function demo(a, b, c) {
// 我们传入了5个实参,所以arguments的length为5,索引分别是0 1 2 3 4
console.log(arguments);
// 使用循环提供一个从 0 ~ 4 的数字
// 循环的结束位我们应该根据 arguments 的 length 来决定
for (var i = 0; i < arguments.length; i++) {
console.log(i) // i 得到的分别是 0 1 2 3 4
// 当 i == 0 的时候, 使用 arguments[0]
// 当 i == 1 的时候, 使用 arguments[1]
// 当 i == 2 的时候, 使用 arguments[2]
console.log(arguments[i]);//循环得出每个索引对应的值
}
}
demo(10,20,30,40,50);
何时使用arguments
因为函数是我们提前定义好的, 为了更好的书写代码, 为了以后多次调用
当我们定义函数的时候, 我能确定以后我使用的时候的实参的个数,我们推荐使用形参的方式来获取, 因为方便
当我们定义函数的时候, 我不能确定以后我使用的时候的实参的个数,我们推荐使用 arguments 的形式来获取, 因为灵活
函数的返回值
什么是返回值: 也就是一个函数的结果
例子: 冰箱
函数: 就是封装一个功能, 冰箱就是封装了一个制冷的功能
参数: 就是在调用的时候传递, 你向冰箱里面放了什么东西
返回值: 就是调用完函数得到的结果, 冰箱能给你的一个什么
在函数里面添加返回值使用 return 关键字
你想让这个函数返回什么, 就写 return 你要返回的数据
function bingxiang(a) {
// 形参 a 就是你传递进来的实参
// 我是一个功能性的东西, 我的功能就是把你传递进来的东西冻起来
var str = '我要把' + a + ' 冻住';
// 把冻好以后的结果给你
// 这个函数将来被调用以后能得到的结果
return str;//这里str=我要把大象冻住
}
var result = bingxiang('大象');
console.log(result);//输出结果:我要把大象冻住
求和小案例
function demo() {
// 准备一个初始变量, 用来接收计算结果
var result = 0;
// 循环遍历 arguments 的每一个参数
for (var i = 0; i < arguments.length; i++) {
// 把 arguments 里面的每一个参数都叠加到 result 变量身上
result += arguments[i];
}
// 循环结束以后, result 就是 arguments 里面每一个数字的和
return result;//返回result的值
}
demo(1,2,3,4,5,6,7,8,9,10);//传几个参数就是求几个参数的和
求质数小案例
质数是指在大于1的自然数中,除了1和它自身外,不能被其他自然数整除的数
// 判断你传入的参数 num 是不是一个质数
function demo(num) {
//因为质数大于1,所以循环2和num之间的数是否能整除
for (var i = 2; i < num; i++) {
//一旦有能整除的数,则返回false,说明不是质数,return后面的代码不再执行
if (num % i == 0) {
return false;
}
}
//如果代码执行到这里,说明没有能整除的数,返回true,这个数是质数
return true;
}
demo(5);