目录
编程求x的阶乘和y的阶乘的和,要求设计一个fac(n)函数求正整数n的阶乘
利用函数实现面积计算器(计算长方形、三角形、圆形的面积)。Math.PI
将一个(反复)使用的功能,封装成一个独立的模块,这个模块叫做函数。
使程序可控 一次封装,无限次使用(增加代码的复用度)
Function
内置函数(库函数、系统函数) 自定义函数
- function 函数名([参数]){
- //功能
- }
- var 变量名 = function([参数]){
- //功能
- }
- <script>
- //声明式函数
- function fn1(){
- // 输出1~100中的所有素数(素数:只能被1和它本身整除的数)
- // 1~100 i = 1;i < 101;i ++
- // j = 2;j <= 本身; j ++
- var str = ''; //放置所有素数的变量
- for(var i = 1;i < 101;i ++){
- for(var j = 2;j <= i;j ++){
- if(i % j === 0){
- break;
- }
- }
- if(i === j){
- str += i + ' ';
- }
- }
- document.write(str);
- }
- fn1();
- document.write('<br>');
- fn1();
- document.write('<br>');
- fn1();
- </script>
- <script>
-
- //声明函数
- function fn(m,n){ //形参(形式参数):用于接收实参的值,必须是变量
- // 输出m行n列的8
- //m 行: 从第一行开始,最m行结束,步长
- var str = '';
- for(var row = 1;row <= m;row ++){
- //n 列: 从第一列开始,最n列结束,步长
- for(var col = 1;col <= n;col ++){
- str += 8;
- }
- str += '\n';
- }
- console.log(str);
- console.log(m,n);
- }
- // m = 8
- var a = parseInt(prompt('请输入行数:'));
- var b = parseInt(prompt('请输入列数:'));
- fn(a,b); //实参(实际参数):给形参传递的数据,可以是常量 ,变量,表达式
- </script>
如果实参的数量少于形参的数量时,多余的形参值为undefined 如果实参的数量多于形参的数量时,多余的实参忽略。
- 比如 1 + 2 是一个表达式,那么 这个表达式的结果就是 3
-
- console.log(1 + 2) // 3
-
- function fn() {
- // 执行代码
- }
-
- // fn() 也是一个表达式,这个表达式就没有结果出现
- console.log(fn()) // undefined
- <script>
- //返回值:将函数中处理的功能后,得到的结果返回到调用这个函数的地方。
- function fn(){
- // 输出一元钱的兑换方案(1角2角5角)
-
- 1角:var one = 0;one < 11;one ++
- 2角:var two = 0;two < 6;two ++
- 5角:var five = 0;five < 3;five ++
- if(1 * one + 2 * two + 5 * five === 10){
-
- }
-
- var str = '';
- for(var one = 0;one < 11;one ++){
- for(var two = 0;two < 6;two ++){
- for(var five = 0;five < 3;five ++){
- if(1 * one + 2 * two + 5 * five === 10){
- str += one + ' 张壹角 ' + two + ' 张贰角 ' + five + ' 张伍角\n';
- }
- }
- }
- }
- console.log(str);
- return str; //将处理后的结果返回到调用这个函数的地方。
- 退出函数了
- alert('瞧瞧');
- }
-
- var result = fn(); //调用fn()的函数,将返回的结果str赋值给result变量
- console.log(result);
-
- console.log(fn());
-
- fn();
-
- console.log(fn());
- </script>
JavaScript中有全局作用域和函数作用域两种作用域,函数作用域只在函数内部有效。在函数内定义的变量和函数只能在该函数内部访问,不能在函数外部访问。以下是函数作用域的示例:
- function greet(name) {
- const message = 'Hello, ' + name + '!';
- console.log(message);
- }
-
- greet('Alice'); // 输出 Hello, Alice!
- console.log(message); // 抛出错误:message未定义
-
闭包是指在一个函数中定义了另一个函数,并且内部函数可以访问外部函数的变量。在JavaScript中,函数可以嵌套定义,内部函数可以访问外部函数的变量,从而形成闭包。以下是闭包的示例:
- function add(a) {
- return function(b) {
- return a + b;
- }
- }
-
- const add2 = add(2);
- console.log(add2(3)); // 输出 5
-
在上面的示例中,add() 函数返回一个匿名函数,这个匿名函数可以访问 add() 函数的参数 a。定义 add2 变量时,将 add(2) 赋值给它,此时 add2 变量就成为了一个新的函数,这个函数可以接收一个参数并返回参数与 a 的和。
回调函数是指将函数作为参数传递给另一个函数,并在另一个函数中调用它。在JavaScript中,回调函数常用于异步编程中,在异步操作完成后执行回调函数。以下是回调函数的示例:
- function add(a, b, callback) {
- const result = a + b;
- setTimeout(function() {
- callback(result);
- }, 1000);
- }
-
- add(2, 3, function(result) {
- console.log(result); // 输出 5
- });
-
除了通过function关键字定义函数外,还可以使用匿名函数,例如:
- var add = function(a, b) {
- return a + b;
- };
- var result = add(3, 4); // 结果为7
-
在JavaScript中,函数可以作为参数传递给其他函数,例如:
- function operate(a, b, operation) {
- return operation(a, b);
- }
- var sum = operate(5, 3, function(x, y) { return x + y; }); // 结果为8
-
- <script>
- //使用函数求三个数中的最大数
- 比较 - 选择语句
- 1. 先求出前两个数中的最大值 一个条件,两个结果(双分支语句)
- 2. 再拿前两个数中的最大值与剩下的下数进行比较,一个条件,一个结果(单分支)
-
- //求三个数中最大值的函数
- function fnMax(a,b,c){
- //求最大值
- var max = a > b ? a : b;
- //与剩下的一个数进行比较
- if(c > max){
- max = c;
- }
- return max;
- }
-
- // alert(fnMax(4,2,5));
-
- 编写函数iseven,其功能为判断一个整数是否为偶数,若是偶数,返回1,否则返回0,在程序中调用此函数,对输入的一个整数进行判断,若是偶数,输出even,否则输出odd
- //封装一个判断奇偶的函数,将结果返回
- function iseven(n){
- return n % 2 ? 0 : 1;
- }
-
- // 输入的一个整数
- var i = parseInt(prompt('请输入一个整数:'));
- //声明一个变量,接收函数的返回值
- var result = iseven(i);
- //根据返回值,判断输出even还是odd
- alert(result === 1 ? 'even' : 'odd');
- </script>
- <script>
- 编程求x的阶乘和y的阶乘的和,要求设计一个fac(n)函数求正整数n的阶乘
- x的阶乘
- y的阶乘
- 和
-
- //封装一个求正整数n的阶乘
- function fac(n){
- for(var i = 1,result = 1;i <= n;i ++){
- result *= i;
- }
- return result;
- }
- //准备两个变量,接收两个整数
- var x = parseInt(prompt('请输入一个整数:'));
- var y = parseInt(prompt('请输入一个整数:'));
- //求和
- var sum = fac(x) + fac(y);
- alert(sum);
- </script>
- <script>
- 利用函数实现面积计算器(计算长方形、三角形、圆形的面积)。Math.PI
- 1. 长方形: 长 * 宽
- 2. 三角形:底 * 高 / 2
- 3. 圆形: Math.PI * r * r
- //封装一个长方形面积的函数
- function rectangle(long,width){
- return long * width;
- }
- //封装一个三角形面积的函数
- function triangle(bottom,height){
- return (bottom * height / 2).toFixed(2);
- }
- //封装一个圆形面积的函数
- function circle(r){
- return (Math.PI * r * r).toFixed(2);
- }
- //封装一个计算器的函数
- function calculator(){
- //设计一个无限循环
- while(1){
- //提示用户输入功能
- var n = parseInt(prompt('0: 退出 1: 长方形 2: 三角形 3: 圆形\n请选择:'));
- //判断
- switch(n){
- case 1 :
- //输入长
- var long = parseInt(prompt('请输入长方形的长:'));
- //输入宽
- var width = parseInt(prompt('请输入长方形的宽:'));
- alert('长方形的面积是:' + rectangle(long,width));
- break;
- case 2 :
- //输入底
- var bottom = parseInt(prompt('请输入三角形的底:'));
- var height = parseInt(prompt('请输入三角形的高:'));
- alert('三角形的面积是:' + triangle(bottom,height));
- break;
- case 3 :
- //输入半径
- var r = parseInt(prompt('请输入圆形的半径:'));
- alert('圆形的面积是:' + circle(r));
- break;
- case 0 : return; //退出函数
- default : alert('其它图形的面积尚未开放,敬请期待!');
- }
- }
- }
- calculator();
- </script>
- <script>
- 计算s=2^2!+3^2!
- 2^2 求2的平方 2 * 2
- 阶乘
- 和
- //1. 求平方函数
- function square(n){
- return n * n;
- }
- //2. 阶乘
- function fac(n){
- for(var i = 1,result = 1;i <= n;i ++){
- result *= i;
- }
- return result;
- }
- //3. 和
- function sum(){
- return fac(square(2)) + fac(square(3));
- }
- alert(sum());
- </script>
自己调用自己的过程。
建议在循环嵌套不确定层数时,使用递归函数。
- // 下面这个代码就是一个最简单的递归函数
- // 在函数内部调用了自己,函数一执行,就调用自己一次,在调用再执行,循环往复,没有止尽
- function fn() {
- fn()
- }
- fn()
- <script>
- //递归:实现循环 (三要素)
- //求 1 + 2 + 3 + …… + n 的和
- function fnSum(n){ //从哪里开始 5 4 3 2 1
- //到哪里结束,退出循环的条件
- if( n === 1){
- return 1;
- }else{
- return n + fnSum(n - 1); //步长
- // 5 + 4 + 3 + 2 + 1
- }
- }
- console.log(fnSum(5));
-
- // 求 n!
- function fnFac(n){
- if(n === 1){
- return 1;
- }else {
- return n * fnFac(n - 1);
- }
- }
- console.log(fnFac(5));
- </script>
- <script>
- //斐波那契数列: 下一个数是前两个数的和
- // 1 1 2 3 5 8 13 21 34 55
- function fib(n){ //循环初值,代表的是第几个斐波那契数字
- //循环条件(退出条件)
- if(n == 1 || n == 2){
- return 1;
- }else{
- return fib(n - 1) + fib(n - 2);
- }
- }
- // alert(fib(10));
- for(var i = 1;i < 21;i ++){
- console.log(fib(i));
- }
- </script>
- <script>
- //输出10个Hello world
- function print(n){
- if(n === 0){
-
- return;
- }else{
- console.log('helloworld');
- print(n - 1);
- }
- }
- print(5);
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器
-
- 一、寻找东西? (var function 形参)
- a = 1
- fn = function fn(){alert(2)}
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
-
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用
- alert(a); //undefined
- var a = 1;
- alert(a); //1
- function fn(){
- alert(2);
- }
- alert(a); //1
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器
-
- 一、预解析(寻找东西?) (var function 形参)
-
-
- a = 3
-
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
- //3. 当变量名与函数名相同时,丢变量、保函数
-
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用
-
- alert(a); //function a(){alert(4)}
- var a = 1;
- alert(a); //1
- function a(){
- alert(2);
- }
- alert(a); //1
- var a = 3;
- alert(a); //3
- function a(){
- alert(4);
- }
- alert(a); //3
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器
- 一、预解析(寻找东西?) (var function 形参)
- fn = function fn(){alert(2)}
- a = 1
-
-
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
- //3. 当变量名与函数名相同时,丢变量、保函数
- //4. 当有多个script标签时,从上到下依次解决每一个script标签,所以建议大家 《将所有声明的语句放到第一个script标签中》
-
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用
-
- alert(a); //报错
- function fn(){
- alert(2);
- }
- </script>
- <script>
- var a = 1;
- fn(); //2
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器(一、预 解析 二、逐行解读代码)
- //3. var 声明在script作用域的变量,称为全局变量,作用范围是整个页面,生存周期在页面开始运行时开启空间,到页面退出时释放内存空间。同时也是window对象的属性。如果var声明的变量或形参在函数中时,称为局部变量,作用范围仅限于当前函数中,生存周期在函数调用时开启空间,到函数调用结束后,释放内存空间。
- //4. 作用域链:从一个作用域中未寻找到内容,会向父级作用域中查找,这个向上查找的过程,称为作用域链。
- 一、预解析(寻找东西?) (var function 形参)
- a = 2
- fn = function(){}
-
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
- //3. 当变量名与函数名相同时,丢变量、保函数
- //4. 当有多个script标签时,从上到下依次解决每一个script标签,所以建议大家 《将所有声明的语句放到第一个script标签中》
-
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用 (函数也是一个作用域)
- 一、预解析
-
- 二、逐行解读代码
- 1. 执行表达式
- 2. 函数调用
-
- alert(a); //undefined
- var a = 1;
- alert(a); //1
- function fn(){
- alert(a); //1
- a = 2;
- alert(a); //2
- }
- fn();
- alert(a); //2
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器(一、预 解析 二、逐行解读代码)
- //3. var 声明在script作用域的变量,称为全局变量,作用范围是整个页面,生存周期在页面开始运行时开启空间,到页面退出时释放内存空间。同时也是window对象的属性。如果var声明的变量或形参在函数中时,称为局部变量,作用范围仅限于当前函数中,生存周期在函数调用时开启空间,到函数调用结束后,释放内存空间。
- //4. 作用域链:从一个作用域中未寻找到内容,会向父级作用域中查找,这个向上查找的过程,称为作用域链。
- 一、预解析(寻找东西?) (var function 形参)
- a = 1
- fn = function(){}
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
- //3. 当变量名与函数名相同时,丢变量、保函数
- //4. 当有多个script标签时,从上到下依次解决每一个script标签,所以建议大家 《将所有声明的语句放到第一个script标签中》
-
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用 (函数也是一个作用域)
- 一、预解析
- a = 2
- 二、逐行解读代码
- 1. 执行表达式
- 2. 函数调用
-
- alert(a); //undefined
- var a = 1;
- alert(a); //1
- function fn(){
- alert(a); //undefined
- var a = 2;
- alert(a); //2
- }
- fn();
- alert(a); //1
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器(一、预 解析 二、逐行解读代码)
- //3. var 声明在script作用域的变量,称为全局变量,作用范围是整个页面,生存周期在页面开始运行时开启空间,到页面退出时释放内存空间。同时也是window对象的属性。如果var声明的变量或形参在函数中时,称为局部变量,作用范围仅限于当前函数中,生存周期在函数调用时开启空间,到函数调用结束后,释放内存空间。
- //4. 作用域链:从一个作用域中未寻找到内容,会向父级作用域中查找,这个向上查找的过程,称为作用域链。
- 一、预解析(寻找东西?) (var function 形参)
- a = 1
- fn = function(){}
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
- //3. 当变量名与函数名相同时,丢变量、保函数
- //4. 当有多个script标签时,从上到下依次解决每一个script标签,所以建议大家 《将所有声明的语句放到第一个script标签中》
-
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用 (函数也是一个作用域)
- 一、预解析
- a = 2
- 二、逐行解读代码
- 1. 执行表达式
- 2. 函数调用
-
-
- var a = 1;
- alert(a); //1
- function fn(a){ //形参
- alert(a); //undefined
- a = 2;
- alert(a); //2
- }
- fn();
- alert(a); //1
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器(一、预 解析 二、逐行解读代码)
- //3. var 声明在script作用域的变量,称为全局变量,作用范围是整个页面,生存周期在页面开始运行时开启空间,到页面退出时释放内存空间。同时也是window对象的属性。如果var声明的变量或形参在函数中时,称为局部变量,作用范围仅限于当前函数中,生存周期在函数调用时开启空间,到函数调用结束后,释放内存空间。
- //4. 作用域链:从一个作用域中未寻找到内容,会向父级作用域中查找,这个向上查找的过程,称为作用域链。
- 一、预解析(寻找东西?) (var function 形参)
- a = 1
- fn = function(){}
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
- //3. 当变量名与函数名相同时,丢变量、保函数
- //4. 当有多个script标签时,从上到下依次解决每一个script标签,所以建议大家 《将所有声明的语句放到第一个script标签中》
-
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用 (函数也是一个作用域)
- 一、预解析
- a = 2
- 二、逐行解读代码
- 1. 执行表达式
- 2. 函数调用
-
-
- var a = 1;
- alert(a); //1
- function fn(a){ //形参 a = 1
- alert(a); //1
- a = 2;
- alert(a); //2
- }
- fn(a); //实参
- alert(a); //1
- </script>
- <script>
- //1. 作用域:JS代码作用的范围
- //2. 一旦进入作用域,浏览器就会启动JS解析器(一、预 解析 二、逐行解读代码)
- //3. var 声明在script作用域的变量,称为全局变量,作用范围是整个页面,生存周期在页面开始运行时开启空间,到页面退出时释放内存空间。同时也是window对象的属性。如果var声明的变量或形参在函数中时,称为局部变量,作用范围仅限于当前函数中,生存周期在函数调用时开启空间,到函数调用结束后,释放内存空间。
- //4. 作用域链:从一个作用域中未寻找到内容,会向父级作用域中查找,这个向上查找的过程,称为作用域链。
- 一、预解析(寻找东西?) (var function 形参)
- a = 2
- fn = function(){}
- //1. 当找到var 或者 形参 时,取后面的名字存储在内存中,并给它初始化一个值undefined
- //2. 当找到function时,取函数名存储在内存中,并将整个函数块赋值给这个函数名.
- //3. 当变量名与函数名相同时,丢变量、保函数
- //4. 当有多个script标签时,从上到下依次解决每一个script标签,所以建议大家 《将所有声明的语句放到第一个script标签中》
- //5. 如果在所有的作用域中都没有找到这个变量,则会在全局作用域中因为赋值号的原因,自动生成这个变量。
- 二、逐行解读代码 (遇到函数声明,则直接跳过)
- 1. 执行表达式
- 2. 函数调用 (函数也是一个作用域)
- 一、预解析
-
- 二、逐行解读代码
- 1. 执行表达式
- 2. 函数调用
-
-
- function fn(){
- a = 2;
- alert(a); //2
- }
- fn();
- alert(a); //2
- </script>