JavaScript 函数调用实战:经典算法与四种调用模式详解

何川
何川
发布时间:2026-10-13| 4人浏览过
原创

本文详细解析 JavaScript 函数的四种调用模式及实际应用。通过实现闰年判断、质数检查和日期验证等经典算法,展示如何将逻辑封装为独立函数并规范调用。内容涵盖方法调用、函数调用、构造器调用以及 apply/call 上下文绑定技巧,帮助开发者构建结构化且易维护的 JS 代码。

JavaScript 函数调用的经典实战

在开发过程中,将业务逻辑封装为独立的函数是提高代码复用性和可读性的关键。以下案例展示了如何在 HTML 页面中引入外部 JS 文件,并调用自定义的判断函数来实现功能。

第1步:准备 HTML 结构与外部脚本引入

目的:建立输入交互界面并加载包含核心逻辑的 JS 库。

操作:

  1. 创建两个 <input> 文本框,分别用于显示闰年和质数的判断结果。
  2. 使用 <script src="../js/tools_practice.js"></script> 引入编写好的工具函数文件。
<body>
    <span>是否为闰年</span>
    <input type="text" id='inp1'>
    <br>
    <span>是否为质数</span>
    <input type="text" id="inp2">
    <br>

    <!-- 外部引入js 文件 -->
    <script src="../js/tools_practice.js"></script>
</body>

第2步:实现核心判断函数

目的:编写通用的数学判断逻辑,包括获取 DOM 元素、生成随机数、闰年检测及质数检测。

关键代码说明:

  • 获取对象:封装 get(id) 简化 document.getElementById 调用。
  • 闰年判断:满足“能被4整除且不能被100整除”或“能被400整除”的条件。
  • 随机数生成:利用 Math.random() 生成指定范围内的整数。
  • 质数判断:从 2 遍历至 n-1,若存在能整除 n 的数则返回 false。
// 获取DOM元素
function get(id) {
    return document.getElementById(id);
}

// 判断某年是否为闰年
function leap_year(x) {
    if (x % 4 === 0 && x % 100 !== 0 || x % 400 === 0) {
        return true;
    }
    return false;
}

// 产生某个范围内的随机整数
function rand(min, max) {
    return Math.round(Math.random() * (max - min) + min);
}

// 判断一个数是否为质数
function isZhi(n) {
    for (var i = 2; i < n; i++) {
        if (n % i === 0) {
            return false;
        }
    }
    return true;
}

第3步:执行调用并输出结果

目的:在 HTML 的 <script> 标签中调用上述函数,并将结果反馈给页面元素。

操作流程:

  1. 调用 leap_year(2004) 判断特定年份,根据返回值修改 inp1 的 value。
  2. 调用 rand(1000, 2000) 生成随机年份,再次调用判断函数并输出日志。
  3. 对质数判断执行相同流程,测试固定值 14 和随机数。
<script>
    var oInp1 = get('inp1');
    // 判断是否为闰年
    var year = leap_year(2004);
    if(year){
        oInp1.value = '是闰年';
    } else {
        oInp1.value = '不是闰年';
    }

    // 随机数判断示例
    var y = rand(1000, 2000);
    var res = leap_year(y);
    if(res){
        document.write('随机数' + y + '是闰年');
    } else {
        document.write('随机数' + y + '不是闰年');
    }

    var oInp2 = get('inp2');
    var n = isZhi(14);
    if(n){
        oInp2.value = '是质数'
    } else {
        oInp2.value = '不是质数'
    }
</script>

第4步:封装复杂的日期合法性验证

目的:处理更复杂的逻辑判断,确保输入的年月日符合日历规则,特别是针对月份天数差异和闰年二月天数的特殊处理。

实现逻辑:

  • 校验年份范围(如 1000-2000)。
  • 校验月份范围(1-12)。
  • 根据月份确定当月最大天数(大月31天,小月30天,二月按闰年29/平年28天处理)。
  • 最后校验日期是否在允许范围内。
function data(y, m, d) {
    // 先判断年
    if (y >= 1000 && y <= 2000 && y % 1 === 0) {
        // 再判断月
        if (m >= 1 && m <= 12 && m % 1 === 0) {
            var maxDay;
            if ([1,3,5,7,8,10,12].includes(m)) {
                maxDay = 31;
            } else if ([4,6,9,11].includes(m)) {
                maxDay = 30;
            } else if (m === 2) {
                // 判断二月天数
                if (y % 4 === 0 && y % 100 != 0 || y % 400 === 0) {
                    maxDay = 29;
                } else {
                    maxDay = 28;
                }
            }
            // 最后判断日期
            if(d >= 1 && d <= maxDay && d % 1 === 0){
                return true;
            }
        }
    }
    return false;
}

// 调用示例
var da = data(2024, 2, 29); // 返回 true
if(da){
    document.write('日期合法');
} else {
    document.write('日期不合法');
}

JS 函数的定义与四种调用模式

理解 JavaScript 中 this 的指向是掌握函数调用的核心。JS 提供了四种主要的调用方式,每种方式决定了 this 绑定到哪个对象。

1. 方法调用模式 (Method Invocation Pattern)

机制:将函数赋值给对象的属性,通过对象访问该属性来调用。

特征:this 指向调用该方法的对象本身。

示例:

var blogInfo = {
    blogId: 123,
    blogName: "myblog",
    showBlog: function() {
        alert(this.blogId); // this 指向 blogInfo
    }
};

blogInfo.showBlog(); // 弹出 123

2. 函数调用模式 (Function Invocation Pattern)

机制:直接调用函数,不通过对象调用。

特征:this 在非严格模式下指向全局对象(浏览器环境中为 window),严格模式下为 undefined。

示例:

var myfunc = function(a, b) {
    return a + b;
};

alert(myfunc(3, 4)); // 输出 7,this 指向 window

3. 构造器调用模式 (Constructor Invocation Pattern)

机制:使用 new 关键字调用函数。

特征:this 指向新创建的实例对象。通常配合原型链(Prototype)扩展实例方法。

示例:

var MyFunc = function(a) {
    this.a = a;
};

MyFunc.prototype = {
    show: function() {
        alert(this.a);
    }
};

var newObj = new MyFunc("123");
newObj.show(); // 弹出 123,this 指向 newObj

4. Apply/Call 调用模式

机制:通过函数的 call 或 apply 方法显式指定调用时的上下文(即 this 的值)。

区别:call 接收参数列表,apply 接收参数数组。

示例:

var myObject = {};
var sum = function(a, b) {
    // 此时 this 指向传入的第一个参数 myObject
    // 虽然这里没用到 this,但展示了上下文切换能力
    return a + b;
};

var result1 = sum.call(myObject, 10, 30); // 参数分开传
var result2 = sum.apply(myObject, [10, 30]); // 参数以数组形式传

alert(result1); // 输出 40

总结

掌握函数调用的基础语法只是第一步,理解不同调用模式下的 this 行为对于解决复杂的前端逻辑至关重要。通过封装如闰年判断、质数检测等基础算法,可以将通用逻辑模块化,使代码结构更加清晰。同时,灵活运用 apply 和 call 可以实现更高级的对象复用和行为控制。以上就是 JavaScript 函数调用经典实例与模式的详细内容,更多关于 JavaScript 编程基础的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。