san.js源码解读之模版解析(parseTemplate)篇——readCall函数

news/2025/2/25 6:00:06

相关文章 san.js源码解读之模版解析(parseTemplate)篇——readAccessor函数

一、源码分析

/**
 * 读取调用
 *
 * @param {Walker} walker 源码读取对象
 * @param {Array=} defaultArgs 默认参数
 * @return {Object}
 */
function readCall(walker, defaultArgs) {
    walker.goUntil(); // 向前读取字符,直到遇到指定字符再停止
    var result = readAccessor(walker); // 读取访问表达式

    var args;
    if (walker.goUntil(40)) { // (   判断是否遇到 '(', 如果遇到进入下面处理
        args = [];

        while (!walker.goUntil(41)) { // ) 判断是否遇到')',它是跳出循环的判断条件
            args.push(readTertiaryExpr(walker)); // 因为在处理函数调用时,会遇到复杂的表达式,所以调用 readTertiaryExpr 函数来处理出现所以表达式的可能
            walker.goUntil(44); // ,
        }
    }
    else if (defaultArgs) {
        args = defaultArgs; // 如果有默认参数时,直接赋值 args。这里比较好理解,因为上面的操作就是解析函数参数的。
    }

    if (args) {
        result = {
            type: ExprType.CALL,
            name: result, // 把之前解析到的访问表达式,放入对象中并起名 name
            args: args
        };
    }

    return result; // 返回结果
}

san.js 中 readCall 函数是用来解析函数调用的。比如

<p>{{max(num1, num2)}}</p>

readCall 函数接收两个参数:walker 和 defaultArgs。

  1. walker 是 Walk 类的实例,它是源码读取对象
  2. defaultArgs 是默认参数,就是调用函数是传入的参数。比如 max(num1, num2) 中的 ’num1‘ 和 ‘num2’

当执行 readCall 函数时,首先执行 goUntil() 函数用来跳过空格、制表符、\r、\n之类的。goUntil 函数源码如下

/**
 * 向前读取字符,直到遇到指定字符再停止
 * 未指定字符时,当遇到第一个非空格、制表符的字符停止
 *
 * @param {number=} charCode 指定字符的code
 * @return {boolean} 当指定字符时,返回是否碰到指定的字符
 */
Walker.prototype.goUntil = function (charCode) {
    var code;
    while (this.index < this.len && (code = this.source.charCodeAt(this.index))) {
        switch (code) {
            case 32: // 空格 space
            case 9: // 制表符 tab
            case 13: // \r
            case 10: // \n
                this.index++;
                break;

            default:
                if (code === charCode) {
                    this.index++;
                    return 1;
                }
                return;
        }
    }
};

可以看出 goUntil 接受一个变量 charCode, 当传入该变量时或判断当前字符是否为传入的字符,如果时就返回 1并跳出循环,否者跳出循环。
接着调用 readAccessor 函数获取当前访问表达式并返回结果,然后向下面判断是否遇到‘(’,如果遇到就开始匹配括号内的参数,代码如下

if (walker.goUntil(40)) { // (   判断是否遇到 '(', 如果遇到进入下面处理
       args = [];

       while (!walker.goUntil(41)) { // ) 判断是否遇到')',它是跳出循环的判断条件
           args.push(readTertiaryExpr(walker)); // 因为在处理函数调用时,会遇到复杂的表达式,所以调用 readTertiaryExpr 函数来处理出现所以表达式的可能
           walker.goUntil(44); // ,
       }
  }

如果没有遇到,接着判断有没有传入默认参数,有的话就直接把默认参数赋值给 args,最后返回属于调用函数类型的对象结果


http://www.niftyadmin.cn/n/5132649.html

相关文章

搭建gnn环境

1.无法激活 激活pytorch遇到报错usage: conda-script.py [-h] [--no-plugins] [-V] COMMAND ... conda-script.py: error: arg-CSDN博客 参考教程 【精选】手把手教你在windows10安装GNN相关环境&#xff08;torchtorch_geometricrdkitdeepchem&#xff09;_gnn环境相关的包-…

2023辽宁省赛E

Solution 题目大致分为三个步骤 计算 P ( S ) P(S) P(S)证明删除区间连续且找到最值位置根据最值位置求出答案 接下来过程中不合法的组合数都默认为 0 0 0 第 1 步 - 求出总值 考虑 S m { 1 , 2 , ⋯ , m } S_m \{1, 2, \cdots, m\} Sm​{1,2,⋯,m} , 则有 $P(S_{n2}…

MySQL篇---第六篇

系列文章目录 文章目录 系列文章目录一、 MySQL 中 varchar 与 char 的区别?varchar(30) 中的 30代表的涵义?二、 int(11) 中的 11 代表什么涵义?三、为什么 SELECT COUNT(*) FROM table 在 InnoDB 比MyISAM 慢?一、 MySQL 中 varchar 与 char 的区别?varchar(30) 中的 30…

win10虚拟机安装教程

目录 1、安装VMware 10、12、16都可以&#xff0c;看个人选择 2、开始安装系统&#xff08;以vm16为例&#xff09; 3、在虚拟机中安装win10 完成 1、安装VMware 10、12、16都可以&#xff0c;看个人选择 下面链是我虚拟机安装包&#xff0c;需要可以下载。 YR云盘 软件安…

ChatGPT 介绍

目录 什么是 AIGC&#xff1f; 图灵测试 chatgpt的发展历史 聊天机器人 Eliza Eliza 后辈 Alice 机器学习 smaterChild 人工神经网络 Transformer OpenAI (Generative Pre-trained Transformer&#xff09; AI会导致我们失业吗 什么是 AIGC&#xff1f; AIGC&#x…

C++ 动态规划 DP教程 (一)思考过程(*/ω\*)

动态规划是一种思维方法&#xff0c;大家首先要做的就是接受这种思维方法&#xff0c;认同他&#xff0c;然后再去运用它解决新问题。 动态规划是用递推的思路去解决问题。 首先确定问题做一件什么事情&#xff1f; 对这件事情分步完成&#xff0c;分成很多步。 如果我们把整件…

关于git推送代码到github远程仓库中文乱码问题,visual studio保存文件默认编码格式问题

中文乱码问题本质上的原因是&#xff1a;二者的编码格式不同。当你用GB2313格式保存一个文件&#xff0c;用utf-8的编码格式打开&#xff0c;它必然就显示乱码。 据我所知&#xff0c;github上面是utf-8&#xff0c;而visual studio默认保存为GB2312&#xff0c;把代码推送到…

HIT_OS_LAB1 调试分析 Linux 0.00 引导程序

操作系统实验一 姓名&#xff1a;董帅学号&#xff1a;2021111547班级&#xff1a;21R0312 1.1 实验目的 熟悉实验环境掌握如何手写Bochs虚拟机的配置文件掌握Bochs虚拟机的调试技巧掌握操作系统启动的步骤 1.2 实验内容 1.2.1 掌握如何手写Bochs虚拟机的配置文件 boot: f…