博客列表 >JS函数种类详解

JS函数种类详解

陈强
陈强原创
2021年01月05日 17:05:501135浏览

函数基本定义

JS定义

  • js是异步的单线程的脚本语言
  • 脚本: 边解释边执行
  • 单线程: 就是同一个时间只执行一个任务(不能并发)
  • 异步: js是基于事件驱动的语言, 通过事件循环来完成

JS的引入方式

  • 属性级: 事件属性,直接写到html的事件属性中
  1. <button onclick="show(this)">Click me</button>
  • 标签级:script标签,只能作用于当前页面
  1. <script>
  2. const btn = document.querySelector('button');
  3. btn.addEventListener('click', show);
  4. function show(ev) {
  5. console.log(ev.target.innerHTML);
  6. ev.target.style.background = 'lightskyblue';
  7. }
  8. </script>
  • 文件引入:可多页面共享
  1. <script src="js.js"></script>

变量和常量

变量

  • 变量声明 关键字let
  1. <script>
  2. //一行声明并初始化赋值
  3. let name = 'jack';
  4. //声明未初始化赋值,默认值underfind
  5. let name;
  6. </script>

常量

  • 常量用const声明,常量名一般用大写,常量不能修改和更新,所以声明时需要初始化赋值
  1. <script>
  2. const APP = '系统'
  3. </script>

变量和常量的命名规则

  • 只能字母,数字,下划线,$,且不能以数字开头
  • 标识符是严格区分大小写的
  • 命名规范:推荐使用小驼峰命名法
  1. //1.蛇形,下划线
  2. let user_name;
  3. //小驼峰,从第二个单词开始首字母大写
  4. let userName;
  5. //大驼峰,所有单词的首字母大写
  6. let UserName;

变量类型及数据转换

原始类型

  • 数值: 整数和小数
  1. let age = 20;
  • 字符串
  1. let name = 'jack';
  • 布尔
  1. let request = true;
  • underfind 初始化未赋值默认为underfind
  1. let name;
  • null
  1. let request = null;

引用类型

  • 对象
  1. let man = {
  2. //属性,相当于变量
  3. name = 'jack',
  4. age = 20,
  5. gander = 'man'
  6. //方法,相当于函数
  7. getName: function () {
  8. // this表示当前的上下文,当前对象
  9. return '我的名字:' + this.name;
  10. }
  11. }
  • 数组
  1. let arr = [1,2,3,4];
  2. //获取第三个元素
  3. console.log(arr[2]);
  4. //添加元素
  5. console.log((arr[4] = 99));
  6. //修改元素
  7. console.log((arr[0] = 100));
  • 函数
  1. function hello(a, b, c);
  2. console.log(arguments);
  3. //添加元素
  4. hello.d = 'd';

数据转换

  • 通常只有相同类型的数据在一起运算,它的结果才有意义
  • “+”:字符串运算中表示连接,此时会自动的触发类型转换
  1. //字符串'100'在运算的时候会转换成数值类型
  2. console.log(100 + '100');
  3. //输出
  4. 100100
  • 类型匹配

    • 只检查值,而不检查类型: ==
  1. console.log(100 == '100');
  2. //输出 true
  • 严格匹配推荐日常使用:===
  1. console.log(100 === '100');
  2. //输出 false

函数提升与重写

  • 函数声明提升
  1. //调用可以写在函数声明前
  2. name();
  3. function name() {
  4. console.log("我叫:jack");
  5. }
  • 函数可以被重写
  1. //将函数赋值给一个常量
  2. const sum = function (a, b) {
  3. return a + b;
  4. };

归并、展开

归并,存在于参数中

  • 举例
  1. function demo2(...arr) {
  2. console.log(arr);
  3. }
  4. demo2(1, 2, 3, 4, 5);
  • 用rest剩余参数封装加法函数
  1. function add1(...arr) {
  2. // console.log(arr);
  3. let res = 0;
  4. for (let num of arr) {
  5. res += num;
  6. }
  7. console.log('计算结果:',res);
  8. }
  9. add1(1, 2, 3, 4, 5, 6, 7);
  10. //输出
  11. 计算结果:28

展开,存在于调用结果中

  • 举例
  1. let arr = [1,2,3,4,5,6];
  2. console.log(...arr);
  • 函数返回值:默认是单值;如果要返回多值,用引用类型(对象、数组)
  1. function demo5() {
  2. return {
  3. status: 1,
  4. message: "成功",
  5. };
  6. }
  7. let res = demo5();
  8. console.log(res.status, res.message);

箭头函数

箭头函数分为胖箭头=>和瘦箭头->

  • 当参数只有一个时,圆括号可以省略,如果没有参数,反而不能省
  • 当有多个参数时, 圆括号必须要写
  • 当有多条语句时,函数体的大括号不能省
  • 如果函数体只有一条语句时,可以省略大括号
  1. let name = 'jack';
  2. let age = 18;
  3. let gender = 'man';
  4. let num;
  5. //完全写法
  6. function demo6() {
  7. return [name, age, gender];
  8. }
  9. res = demo6();
  10. console.log(res);
  11. //用箭头函数简写,可以省略function 和return及{}
  12. let demo6 = () => [name, age, gender];
  13. res = demo6();
  14. console.log(res);
  15. //如果只有一个参数可以省略()
  16. let demo6 = num => [name, age, gender];
  17. res = demo6(num);
  18. console.log(res);

高阶函数

回调函数

  • 回调函数就是把函数作为另一个函数的参数使用
  1. document.addEventListener("click", function () {
  2. alert("Hello World~~");
  3. });

偏函数

  • 简化了声明时的参数声明,把一些参数交给子函数处理
  1. let sum = function (a, b) {
  2. return function (c, d) {
  3. return a + b + c + d;
  4. };
  5. };
  6. let f1 = sum(1, 2);
  7. console.log(f1(3, 4));

柯里化

  • 每一级函数只处理一个参数
  1. sum = function (a) {
  2. return function (b) {
  3. return function (c) {
  4. return function (d) {
  5. return a + b + c + d;
  6. };
  7. };
  8. };
  9. };
  10. // 简化了调用参数
  11. let res = sum(10)(20)(30)(40);
  12. console.log(res);

纯函数

  • 完全独立于调用上下文,返回值只能受到传入的参数影响
  1. //纯函数
  2. function add(a, b) {
  3. console.log(a + b);
  4. }
  5. add(1, 2);
  6. //不是纯函数
  7. function getDate() {
  8. return Date.now();
  9. }
  10. console.log(getDate());

作用域与闭包

作用域

  • 全局作用域:全局都可以调用
  1. let name = "jack";
  • 局部作用域:函数作用域
  1. function name() {
  2. //函数私有变量
  3. let age = 18;
  4. console.log("我叫:jack");
  5. }
  • 块作用域:
  1. {
  2. let name = 'Tom';
  3. }

闭包

  • 能够访问自由变量的函数,所以理论上讲,任何函数都是闭包

  • 自由变量: 即不是函数参数变量也不是私有变量,存在于函数调用上下文中

  1. let num = 100;
  2. function add(a, b) {
  3. // a,b: 参数变量
  4. // t: 私有变量
  5. let t = 0;
  6. // num: 自由变量
  7. return t + a + b + num;
  8. }
  • 私有变量可以作为另一个函数的自由变量
  1. function f1() {
  2. let a = 1;
  3. // a 相对于f1是私有变量,但是相对于返回的匿名函数就是一个自由变量
  4. return function () {
  5. return a++;
  6. };
  7. }
  8. //把函数赋给一个变量
  9. let f2 = f1();
  10. //输出f1的匿名函数
  11. console.log(f2());

立即执行函数

  • 立即执行:声明完直接调用
  1. //函数用()包含起来,并把调用直接跟随在后边
  2. (function sum(a, b) {
  3. console.log(a + b);
  4. })(1, 2);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议