大家好,欢迎大家来到 JS 脚本语言的第四课。从今天这一课开始,我们将给大家讲一讲函数及其调用方法。
如前面的课程所述,当你学过初中数学,你就会接触到第一种函数,比如一次函数。在数学里,函数就像一个固定的公式,你扔进去一个 x,它就能吐出一个对应的 y。但在数学中,x 只有取值范围,没有“作用域”的概念,也就是说,不管 x 怎么变,公式都能直接用它。
但在编程中,函数更像是一台“自动售货机”。你往里面投币(传入参数),机器内部进行加工(函数体执行),最后掉出一瓶饮料(返回值)。而且,这台售货机有自己的“独立工作车间”(作用域),车间里的东西不能随便拿到外面,外面的东西也不能随便拿进车间。这就是编程函数和数学函数在概念上最大的区别。不过它们的本质是一样的:都是接收输入,给出输出。
在编程里,这台“售货机”非常高级,它不仅能接收数字,还能接收文字、数组、甚至另一台“售货机”(也就是函数)。说到把函数传进去,我得啰嗦几句:传进去的函数叫“回调函数”,它就像是给主函数定了一个闹钟或者指令,告诉主函数“你在某个时候,记得执行一下我”。
我们重点花两节课的时间给大家讲一讲函数的传参以及返回。有了这两节课的内容,大家就可以写出一个小程序了。今天这节课,我们主要讲函数的传参和调用。
什么是传参?什么是调用?什么是返回值?我们用一个超级接地气的例子来解释:
你的妈妈让你从她那里拿10块钱去买酱油。
她给你的10块钱,就是“参数”。
你拿着钱出门去买酱油的这个动作,就是“调用”。
你最终买回来交给她的酱油,就是“返回值”。
大家细品一下:你的妈妈给你钱(传参),同时隐含了一个指令“买完必须回来”(返回值约定)。在代码里,当你调用一个函数时,你不仅要告诉它“你需要处理什么数据”,还要明确“你处理完应该给我一个什么结果”。这个结果,就是返回值。
在 JS 里,定义一个函数有很多种写法。我们先看最传统的一种,叫“函数声明”。这就好比你在工商局“注册”了一台售货机。它的样子大概是这样的:
function buySoySauce(money) {
// 这里是函数体,也就是“去买酱油”的具体过程
let soySauce = "酱油";
return soySauce;
}
你看,money 就是机器上的“进料口”(参数),return soySauce 就是把酱油从“出料口”递给你,有你递给你的妈妈。
那怎么让这台机器运转起来呢?也就是怎么“调用”?很简单:
let result = buySoySauce(10);
console.log(result); // 输出:酱油
这里的 10 就是你投进去的硬币(传进去的参数),result 就是你拿个盆在出料口接到的东西(接收到的返回值)。
好,那有同学可能就要问了:如果我不投币,或者我想投多个币,怎么办?
没问题。JS 里的机器很灵活,可以一个进料口都没有,也可以有很多个进料口,用逗号隔开就行。比如我们造一台加法机器:
function add(a, b) {
return a + b;
let sum = add(3, 5);
console.log(sum); // 输出:8
假如你只投了一个币,比如 add(3),那么 b 这个进料口就空着了。机器不知道空着代表啥,就给它贴个标签叫 undefined(未定义),最后算出来的结果就是个乱码 NaN(Not a Number,不是数字)。这就要说到一个很重要的概念:参数的数量匹配。JS 不强制你投够币,少了就补 undefined,多了就把多出来的扔掉。
但也有的时候,你希望就算不投币,机器也能用默认的材料干活,那我们可以这样写:
function greet(name = "朋友") {
console.log("你好," + name);
greet(); // 输出:你好,朋友
greet("张三"); // 输出:你好,张三
这个叫“默认参数”,相当于机器出厂时自带了默认原料,非常好用。
接下来我们讲讲调用。刚才我们直接写了函数名加括号,这叫普通调用。但在 JS 里,函数还有一个特别的身份:它本身也是一种“物品”。你完全可以把它打包存到变量里,然后再通过变量来调用。比如:
let fn = function(a, b) {
return a - b;
};
let result = fn(10, 4);
console.log(result); // 输出:6
这种写法叫做“函数表达式”。它和前面的函数声明看起来差不多,但有个细微的区别:函数声明可以在定义之前调用(因为系统会提前注册),函数表达式不行(必须等代码执行到那一行,盒子才算造好)。这个我们以后再细讲。现在大家只要记住,函数可以当作普通物品传来传去。
也正是因为这样,我们才能把一个函数作为参数传给另一个函数。传进去的函数,就是我们开头说的“回调函数”。
举个例子,你写了一个“做饭”的函数,它需要一个“买食材”的动作作为参数:
function cook(buyIngredients) {
let food = buyIngredients("白菜");
console.log("做好了" + food);
function buyIngredients(item) {
return "清洗过的" + item;
cook(buyIngredients);
这里的 buyIngredients 就是回调函数。cook 函数不关心你怎么买菜,它只需要你在它需要的时候,把菜给它就行。这就是回调的意义:控制主函数在某个时机,去执行你传进去的那个动作,并获取你需要的值。
好,今天这节我们主要就讲了传参、调用和返回值。大家记住三个重点:
第一,参数是你给函数的东西,返回值是函数给你的结果;
第二,函数可以没有参数,也可以有多个参数,还可以有默认参数;
第三,函数本身也能作为参数传进去,这种函数叫回调函数。
下一节课我们继续深入讲返回值的各种花式玩法,比如返回一个函数,以及闭包的初步认识。
今天课后大家可以自己写一个函数,模拟“你妈给你10块钱,你买酱油找零2块”的过程。参数是钱,返回值是酱油和找零。提示一下,用“对象”打包返回就行,就像你拿一个塑料袋,把酱油和2块钱零钱装在一起递给妈妈。
好了,这节课就到这里,我们下节课见。
目录
大家好,欢迎大家来到 JS 脚本语言的第四课。从今天这一课开始,我们将给大家讲一讲函数及其调用方法。
如前面的课程所述,当你学过初中数学,你就会接触到第一种函数,比如一次函数。在数学里,函数就像一个固定的公式,你扔进去一个 x,它就能吐出一个对应的 y。但在数学中,x 只有取值范围,没有“作用域”的概念,也就是说,不管 x 怎么变,公式都能直接用它。
但在编程中,函数更像是一台“自动售货机”。你往里面投币(传入参数),机器内部进行加工(函数体执行),最后掉出一瓶饮料(返回值)。而且,这台售货机有自己的“独立工作车间”(作用域),车间里的东西不能随便拿到外面,外面的东西也不能随便拿进车间。这就是编程函数和数学函数在概念上最大的区别。不过它们的本质是一样的:都是接收输入,给出输出。
在编程里,这台“售货机”非常高级,它不仅能接收数字,还能接收文字、数组、甚至另一台“售货机”(也就是函数)。说到把函数传进去,我得啰嗦几句:传进去的函数叫“回调函数”,它就像是给主函数定了一个闹钟或者指令,告诉主函数“你在某个时候,记得执行一下我”。
我们重点花两节课的时间给大家讲一讲函数的传参以及返回。有了这两节课的内容,大家就可以写出一个小程序了。今天这节课,我们主要讲函数的传参和调用。
什么是传参?什么是调用?什么是返回值?我们用一个超级接地气的例子来解释:
你的妈妈让你从她那里拿10块钱去买酱油。
她给你的10块钱,就是“参数”。
你拿着钱出门去买酱油的这个动作,就是“调用”。
你最终买回来交给她的酱油,就是“返回值”。
大家细品一下:你的妈妈给你钱(传参),同时隐含了一个指令“买完必须回来”(返回值约定)。在代码里,当你调用一个函数时,你不仅要告诉它“你需要处理什么数据”,还要明确“你处理完应该给我一个什么结果”。这个结果,就是返回值。
在 JS 里,定义一个函数有很多种写法。我们先看最传统的一种,叫“函数声明”。这就好比你在工商局“注册”了一台售货机。它的样子大概是这样的:
function buySoySauce(money) {
// 这里是函数体,也就是“去买酱油”的具体过程
let soySauce = "酱油";
return soySauce;
}
你看,money 就是机器上的“进料口”(参数),return soySauce 就是把酱油从“出料口”递给你,有你递给你的妈妈。
那怎么让这台机器运转起来呢?也就是怎么“调用”?很简单:
let result = buySoySauce(10);
console.log(result); // 输出:酱油
这里的 10 就是你投进去的硬币(传进去的参数),result 就是你拿个盆在出料口接到的东西(接收到的返回值)。
好,那有同学可能就要问了:如果我不投币,或者我想投多个币,怎么办?
没问题。JS 里的机器很灵活,可以一个进料口都没有,也可以有很多个进料口,用逗号隔开就行。比如我们造一台加法机器:
function add(a, b) {
return a + b;
}
let sum = add(3, 5);
console.log(sum); // 输出:8
假如你只投了一个币,比如 add(3),那么 b 这个进料口就空着了。机器不知道空着代表啥,就给它贴个标签叫 undefined(未定义),最后算出来的结果就是个乱码 NaN(Not a Number,不是数字)。这就要说到一个很重要的概念:参数的数量匹配。JS 不强制你投够币,少了就补 undefined,多了就把多出来的扔掉。
但也有的时候,你希望就算不投币,机器也能用默认的材料干活,那我们可以这样写:
function greet(name = "朋友") {
console.log("你好," + name);
}
greet(); // 输出:你好,朋友
greet("张三"); // 输出:你好,张三
这个叫“默认参数”,相当于机器出厂时自带了默认原料,非常好用。
接下来我们讲讲调用。刚才我们直接写了函数名加括号,这叫普通调用。但在 JS 里,函数还有一个特别的身份:它本身也是一种“物品”。你完全可以把它打包存到变量里,然后再通过变量来调用。比如:
let fn = function(a, b) {
return a - b;
};
let result = fn(10, 4);
console.log(result); // 输出:6
这种写法叫做“函数表达式”。它和前面的函数声明看起来差不多,但有个细微的区别:函数声明可以在定义之前调用(因为系统会提前注册),函数表达式不行(必须等代码执行到那一行,盒子才算造好)。这个我们以后再细讲。现在大家只要记住,函数可以当作普通物品传来传去。
也正是因为这样,我们才能把一个函数作为参数传给另一个函数。传进去的函数,就是我们开头说的“回调函数”。
举个例子,你写了一个“做饭”的函数,它需要一个“买食材”的动作作为参数:
function cook(buyIngredients) {
let food = buyIngredients("白菜");
console.log("做好了" + food);
}
function buyIngredients(item) {
return "清洗过的" + item;
}
cook(buyIngredients);
这里的 buyIngredients 就是回调函数。cook 函数不关心你怎么买菜,它只需要你在它需要的时候,把菜给它就行。这就是回调的意义:控制主函数在某个时机,去执行你传进去的那个动作,并获取你需要的值。
好,今天这节我们主要就讲了传参、调用和返回值。大家记住三个重点:
第一,参数是你给函数的东西,返回值是函数给你的结果;
第二,函数可以没有参数,也可以有多个参数,还可以有默认参数;
第三,函数本身也能作为参数传进去,这种函数叫回调函数。
下一节课我们继续深入讲返回值的各种花式玩法,比如返回一个函数,以及闭包的初步认识。
今天课后大家可以自己写一个函数,模拟“你妈给你10块钱,你买酱油找零2块”的过程。参数是钱,返回值是酱油和找零。提示一下,用“对象”打包返回就行,就像你拿一个塑料袋,把酱油和2块钱零钱装在一起递给妈妈。
好了,这节课就到这里,我们下节课见。