BCSP-玄子前端开发之JavaScript+jQuery入门CH02_JavaScript函数

BCSP-玄子前端开发之JavaScript+jQuery入门CH02_JavaScript函数

4.2 函数

4.2.1 什么是函数

类似于Java中的方法,是完成特定任务的代码语句块

  • 特点

    • 使用更简单不用定义属于某个类,直接调用执行
  • 分类

    • 系统函数

    • 自定义函数

4.2.2 常用系统函数

  • 将字符串转换为整型数字
parseInt("字符串");
  • 将字符串转换为浮点型数字
parseFloat("字符串");

从下标为0起,依次判断每个字符是否可以转换为一个有效数字

  • 如果不是有效数字,则返回NaN,不再继续执行其他操作
  • 如果是有效数字,则该函数将查看下标为1的字符,进行同样的测试,直到发现非有效数字的字符或全部检测完为止
  • 检查其参数是否是非数字
isNaN(x);

通常,使用isNaN()函数检测parseInt()和parseFloat()的运算结果,判断它们表示的是否是合格的数字;

也可以使用isNaN()函数检测操作数是否有错误,例如:用0作为除数的情况

4.2.3 自定义函数

与 Java 语言一样,JavaScript中需要先定义函数,再调用函数

定义函数的方式

  • 函数声明
  • 函数表达式

4.2.4 函数声明

由关键字 function、函数名、一组参数及置于括号中的待执行的 JavaScript 语句组成

  • 定义函数
function 函数名([参数1[, 参数2[, 参数3,] ] ]) {
    				// 参数是可选的
    //JavaScript语句;
    [return 返回值]
    // 可有可无
}

JavaScript是弱数据类型,对于函数参数没有类型检查和类型限定

  • 调用函数
事件名="函数名([参数值1[, 参数值2[, 参数值3,…] ])";

一般和表单元素的事件一起使用

  • 调用无参函数

定义并调用无参函数,输出5次“欢迎学习JavaScript”

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input name="btn" onclick="study( )" type="button" value="显示5次欢迎学习JavaScript"/>
// 单击此按钮时,调用函数study( ),执行函数体中的代码
</body>
<script type="text/javascript">
    function study() {
        for (var i = 0; i < 5; i++) {
            document.write("<h4>欢迎学习JavaScript</h4>");
        }
    }

    // 定义无参函数study()
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7fBHZrSs-1681957325917)(./assets/image-20230420093013462.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LUt8JZmJ-1681957325919)(./assets/image-20230420093029638.png)]

  • 调用有参函数

键盘接收“欢迎学习JavaScript”输出行数,并按指定数字输出到网页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input name="btn" onclick="study(prompt('请输入显示欢迎学习JavaScript的次数:',''))"
       type="button"
       value="请输入显示欢迎学习JavaScript的次数"/>
</body>
</html>
<script type="text/javascript">
    function study(count) {
        for (var i = 0; i < count; i++) {
            document.write("<h4>欢迎学习JavaScript</h4>");
        }
    }
    // 使用系统函数prompt()接受行数,作为参数传递给自定义函数study()
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIbe6i1M-1681957325920)(./assets/image-20230420093311411.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ywK4Ciqb-1681957325920)(./assets/image-20230420093458717.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkTGudgj-1681957325920)(./assets/image-20230420093506323.png)]

4.2.5 函数表达式

将函数赋给变量

  • 定义函数
var 变量 = function([参数值1[, 参数值2[, 参数值3,] ]) {
    //JavaScript语句;
};
  • 调用函数
变量([参数值1[, 参数值2[, 参数值3,] ]);
  • 使用函数声明的方式定义两个函数名都为f1()的函数
<script>
    //函数声明
    function f1() {
        console.log("今天天气真好!");
    }

    f1();

    function f1() {
        console.log("今天天气好晴朗,处处好风光!");
    }

    f1();
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dl1Jgqyj-1681957325921)(./assets/image-20230420100122769.png)]

  • 使用函数表达式方式定义两个函数名都为f2()的函数
<script>
    //函数表达式
    var f2 = function () {
        console.log("哇~");
    };
    f2();
    var f2 = function () {
        console.log("哇哈哈~");
    };
    f2();
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-280B8VJ9-1681957325921)(./assets/image-20230420100209252.png)]

使用函数声明方式定义两个同名的函数时,后面的函数将会覆盖前面的函数;

使用函数表达式方式定义同名的函数时,会从上到下,逐行执行代码,并输出结果

4.2.6 预解析

顾名思义就是提前解析代码,主要完成两项工作

  1. 变量的声明会提前
  2. 函数的声明也会被提前
  • 先声明变量或声明函数,后在控制台输出结果
<script>
    console.log(num); //undefined
    var num = 10;
    // 结论1 预解析可以把变量的声明提前		
    f1();

    function f1() {
        var num = 100;
        console.log(num); //100
    }

    // 结论2 预解析可以把函数的声明提前
</script>

4.2.7 函数自调用

自定义函数分类

  • 命名函数
  • 匿名函数
(function() {
	//函数体	    
})();
// 声明并调用匿名函数

匿名函数的特点与好处

  • 函数没有名字,在声明的同时便直接调用

  • 同名函数之间不会有冲突

4.2.8 回调函数

将函数作为另一个函数的参数使用

<script>
    // 回调函数
    function f1(fn) {
        console.log("f1函数调用了");
        fn();
    }

    function f2() {
        console.log("f2函数调用了");
    }

    f1(f2);
    // 函数f2()作为函数f1()的参数
</script>

如果没有指定回调函数的名称,则称之为 匿名回调函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-efSUqgEl-1681957325921)(./assets/image-20230420100752068.png)]


4.3 变量的作用域

根据变量作用范围不同,分类

局部变量

  • 在函数内部声明的变量(必须使用var)
  • 只能在函数内部访问它
  • 可以在不同的函数中使用名称相同的局部变量

全局变量

  • 在函数外声明的变量
  • 网页的所有脚本和函数都能访问它

4.3.1 局部变量和全局变量

<script>
    var x = 10;
	// 全局变量
    function f1() {
        var y = 5;
        // 局部变量
        console.log(x);
        console.log(y);
    }

    f1();
    console.log(x);
    console.log(y);
// 在函数f1()外部输出局部变量y值时
// 会报错“y is not defined”

</script>

4.3.2 局部变量与全局变量的区别

局部变量全局变量
作用域仅作用在函数中作用在整个脚本
声明位置函数中使用之前的任何位置
生存期在函数运行以后被删除在页面关闭后被删除

4.3.3 隐式全局变量

如果变量声明时,没有使用关键字var,则被称为隐式全局变量

var a1 = 1;  //全局变量
a2 = 2;      //隐式全局变量

如果在函数内部声明变量时,没有使用关键字var,则也是隐式全局变量

function f1() {
    num = 200;
    // 隐式全局变量
}
f1();
console.log( num ); 
// 函数外可以访问变量 num

4.3.4 隐式全局变量和全局变量的区别

声明全局变量a1和隐式全局变量a2

var a1=1;
a2=2;
delete a1;
delete a2;
console.log(typeof a1); //number
console.log(typeof a2); //undefined

隐式全局变量可以被删除,全局变量不可以被删除

4.3.5 作用域与块级作用域

作用域

  • 是变量与函数的可访问范围
  • 控制着变量与函数的可见性和生命周期

块级作用域

  • 由花括号“ { } ”限定
  • 所有的变量都定义在花括号内
  • 变量从定义开始到花括号结束的范围内可以使用

使用场景

  • 正常带有大括号的语句
  • 条件语句
  • 循环语句
  • 函数

4.3.6 作用域链

Scope Chain

  • 是JavaScript内部一种变量、函数查找机制
  • 决定了变量和函数的作用范围

当执行函数时,先从函数内部寻找局部变量

  • 如果内部找不到,则向创建函数的作用域寻找,依次向上
  • 如果最终没有找到,通常会报错
<script>
var num=10
// <script>里定义的变量,是0级作用域
function f1() {
    var num=20;
    // 1级作用域
    function f2() {
        var num=30;
        // 2级作用域
        function f3() {
            var num=50;
            // 3级作用域
            console.log(num); 
        }
        f3();
    }
    f2();
}
f1();
</script>

4.3.7 闭包

在函数外部读取函数内的局部变量

闭包(closure)

  • 能够读取其他函数内部变量的函数
  • 是将函数内部和函数外部链接起来的桥梁

实现步骤

  1. 在一个函数的内部,再定义一个函数
  2. 把内部的函数作为返回值

特性

  • 函数嵌套
  • 内部函数可以访问外部函数的变量
  • 参数和变量不会被回收

最典型的应用

  • 实现回调函数

使用闭包,在函数外部读取函数内的局部变量

<script>
function f1() {
    var num = 1;
    function f2() {
        alert(num);
    }
    //  函数f2()就是闭包
    // 内部函数中,访问外层函数的局部变量
    return f2;
    // 把内部函数f2()作为外层函数的返回值
    
}
var result = f1();
result();
</script>

作用

  • 可以读取函数内部的变量
  • 让这些变量的值始终保存在内存中

缺点

  • 在父函数外部,可以改变父函数内部变量的值
  • 常驻内存,会增大内存使用量,使用不当很容易造成内

4.4 事件

事件(Event)是使用JavaScript实现网页特效的灵魂内容,浏览器会触发各种事件实现网页中的各种特效

名称说明
onload一个页面或一幅图像完成加载
onlick鼠标单击某个对象
onmouseover鼠标指针移到某元素上方
onmouseout鼠标指针离开某元素上方
onkeydown某个键盘按键被按下
onchange域的内容被改变

BCSP-玄子前端开发之JavaScript+jQuery入门CH02_JavaScript函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值