当前位置: 首页 > article >正文

JavaScript中的函数定义

第8章 函数

在JS中函数即对象,程序可以随意操控他们。可以把函数赋值给变量,或者作为参数传递给其他函数。因为函数就是对象,所以可以给他们设置属性,甚至调用他们的方法。

JavaScript的函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量,这意味着JavaScript函数构成了一个闭包closure,它给JS带来了非常强劲的编程能力。

8.1 函数定义

使用function关键字来定义,用在表达式或者函数声明语句两种形式。

都以function关键字开始,随后跟随以下组成部分:

  • 函数名称标识符,就像变量名称,新定义的函数对象会赋值给这个变量,对函数定义表达式来说,这个名字是可选的,如果存在,该名字只存在于函数体中,并指代该函数对象本身。
  • 一对圆括号,包含0个或多个用逗号隔开的标识符组成的列表,这些标识符是函数的参数名称,就像函数体中的局部变量一样。
  • 一对花括号,包含若干JS语句,构成了函数体,调用函数后就会执行这些语句。

8-1 定义JavaScript函数

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>8-1 定义JavaScript函数</title>
    <script>
        //输出o的每个属性的名称和值,返回undefined
        function printprops(o) {
            for (var p in o) {
                console.log(p + ":" + o[p] + "\n");
            }
        }
        //计算两个笛卡尔坐标(x1,y1)和(x2,y2)之间的距离
        function distance(x1, y1, x2, y2) {
            var dx = x2 - x1;
            var dy = y2 - y1;
            return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
        }
        //计算阶乘的递归函数(调用自身的函数)
        function factorial(x) {
            if (x <= 1) {
                return 1;
            }
            return x * factorial(x - 1)
        }
        //函数表达式定义了一个函数用来求传入参数的平方
        var square = function (x) {
            return x * x
        };
        //函数表达式可以包含名称,这在递归时很有用
        var f = function fact(x) {
            if (x <= 1) {
                return 1;
            } else {
                return x * fact(x - 1);
            }
        }
        //函数表达式也可以作为参数传给其他函数
        var data = [2, 1, 3, 5, 4, 7, 6, 8, 9]
        data.sort(function (a, b) {
            return a - b;
        });
        //函数表达式有时定义后立即调用,10为参数默认值
        var tensquared = (function (x) {
            return x * x;
        }(10));
    </script>
</head>

<body>
    <h1>8-1 定义JavaScript函数</h1>
    <textarea name="" id="" cols="80" rows="43" readonly>
    <script>
        //输出o的每个属性的名称和值,返回undefined
        function printprops(o) {
            for (var p in o) {
                console.log(p + ":" + o[p] + "\n");
            }
        }
        //计算两个笛卡尔坐标(x1,y1)和(x2,y2)之间的距离
        function distance(x1, y1, x2, y2) {
            var dx = x2 - x1;
            var dy = y2 - y1;
            return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
        }
        //计算阶乘的递归函数(调用自身的函数)
        function factorial(x) {
            if (x <= 1) {
                return 1;
            }
            return x * factorial(x - 1)
        }
        //函数表达式定义了一个函数用来求传入参数的平方
        var square = function (x) {
            return x * x
        };
        //函数表达式可以包含名称,这在递归时很有用
        var f = function fact(x) {
            if (x <= 1) {
                return 1;
            } else {
                return x * fact(x - 1);
            }
        }
        //函数表达式也可以作为参数传给其他函数
        var data = [2, 1, 3, 5, 4, 7, 6, 8, 9]
        data.sort(function (a, b) {
            return a - b;
        });
        //函数表达式有时定义后立即调用,10为参数默认值
        var tensquared = (function (x) {
            return x * x;
        }(10));
    </script>
        </textarea>
</body>

</html>

注意:以表达式定义的函数,函数名是可选的,一条函数声明语句实际上声明了一个变量,并把函数对象赋值给它。相对而言,定义函数表达式时并没有声明一个变量。函数可以命名,就像上面的阶乘函数,它需要一个名字来指代自己。如果一个函数定义表达式包含名称,函数的局部作用域将会包含一个绑定到函数对象的名称,实际上函数的名称成为函数内部的一个局部变量。

通常来说以表达式方式定义函数时都不需要名称,这会让定义它们的代码更为紧凑。函数定义表达式特别适合用来定义那些只会用到一次的函数,比如上面展示的最后两个例子。

函数命名

合法的JS标识符都可以作为函数名称,尽量选择描述性强而又简洁的函数名。

通常以动词或动词为前缀的词组,第一个字符小写,多个单词时,一种是下划线隔开,就像like_this(),还有一种约定就是除了第一个单词之外首字母大写,也叫小驼峰命名法,就像likeThis()。有些函数用作内部函数或私有函数,通常以下划线为前缀。

一些编程风格和框架中,为调用函数指定短名字,例如jQuery就将最常用方法命名为$(),$和_是除了字母和数字外,两个合法的标识符。

函数声明语句会被提前到外部脚本或作用域的顶部,它之前定义的函数也可以调用它。但表达式定义的函数另当别论,调用它必须引用它,变量声明可以提前,但是赋值不能,因此,表达式定义之前的函数无法调用它。

函数有return返回对应内容,没有没人返回undefined,没有返回值的函数可以成为过程。

嵌套函数

JS中函数是可以嵌套在其他函数里的。

案例:

嵌套函数有趣之处在于它的变量作用域规则:他们可以访问嵌套它们的函数的参数和变量,上面代码中内部函数square()可以读写外部函数nest定义的参数a,b。作用域规则对内嵌函数非常重要。

函数声明语句,规范只允许它们出现在全局代码里,或者内嵌其他函数中,但不能出现在循环、条件判断、异常处理等语句中。

函数定义表达式可以出现在任何地方。


http://www.kler.cn/a/325549.html

相关文章:

  • AWS Lambda
  • 45_Lua模块与包
  • SpringBoot整合Dubbo+zookeper[详细版]
  • (即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力
  • Spring AI 从入门到实践
  • 大疆上云API基于源码部署
  • 位图:如何实现网页爬虫中的 URL 去重功能?
  • 网络通信(学习笔记)
  • 【重学 MySQL】四十二、单行子查询
  • 城市大脑:智慧城市的神经中枢——典型实践与经验启示
  • K8s安装部署(v1.28)--超详细(cri-docker作为运行时)
  • Spring Boot 3.x 配置 Spring Doc以及导入postman带图详解
  • 数据集-目标检测系列-鼠检测数据集 mouse >> DataBall
  • 自动蛋鸡饲料机组:粉碎搅拌一步到位
  • 【高频SQL基础50题】11-15
  • Linux中的tr命令详解
  • 11-pg内核之锁管理器(六)死锁检测
  • PostgreSQL 一张表多个字段关联另一张表
  • 路由器的天线有什么用?数量多≠信号强?
  • C++番外篇-------排序算法总结
  • 数字孪生平台,助力制造设备迈入超感知与智控新时代!
  • 《C++多态性:开启实际项目高效编程之门》
  • Error:Decorators are not valid here. 使用Angular中的装饰器
  • MetaAI最新开源Llama3.2亮点及使用指南
  • 企业构建AI所需的最低可行基础设施:从数据存储到大模型集成
  • rocky9.2实现lvs(DR模式)+keepalived实现高可用的案例详解(双机热备、lvs负载均衡、对后端服务器健康检查)