• 【知识点】JavaScript中require的一些理解


    以下内容源自个人理解,若有错误欢迎指出。

    以下是在autojs中进行的测试。

    猜想

            多个文件中require同一个文件时,对于首次出现的require,会去读取文件并执行一遍,然后加入缓存;之后当再次require到这个文件时,只会指向这个缓存,可以理解成设置了一个指向这个缓存的指针,但是不会再次执行该文件。

            由于缓存的存在,因此多个地方require同一个文件,实际上都是操控同一个缓存,因此一处的修改,会影响到另一处,可以理解成全局的。

    验证

    main.js:

    1. var test1 = require('./test1');
    2. var test2 = require('./test2');

    test1.js

    1. var test3 = require('./test3');
    2. log('t1');
    3. test3.t3("1");
    4. var myapp = {}
    5. function t1 () {
    6. log('t1');
    7. }
    8. myapp.t1 = t1;
    9. module.exports = myapp;

    test2.js

    1. var test3 = require('./test3');
    2. log('t2');
    3. test3.t3("2");
    4. var myapp = {}
    5. myapp.t2 = function t2 () {
    6. log('t2');
    7. }
    8. module.exports = myapp;

    test3.js

    1. var myapp = {}
    2. log('t3');
    3. var tt = "0"
    4. myapp.t3 = function t3 (a) {
    5. log(tt);
    6. log(a);
    7. tt = a;
    8. }
    9. module.exports = myapp;

    运行结果

    结果分析

           1、 t3、t1、0:说明main.js中的var test1 = require('./test1');调用了test1.js,其中test1.js中的var test3 = require('./test3');又调用了test3.js,所以先输出了t3,然后test1.js继续往下执行,输出了t1;

            2、0、1:紧接着,test1.js中test3.t3("1");调用了test3中的方法,先输出了全局变量tt的值为0,然后输出修改后的值为1;

            3、t2:回到main.js中继续往下执行,到了var test2 = require('./test2');调用了test2.js,实际上test2.js的第一行var test3 = require('./test3');调用了test3.js,按照第1点的描述,如果读取和执行了test3.js文件,那应该会输出t3,但这里没有,说明了并没有执行test3.js;

            4、1、2:紧接着test2.js中也执行了test3.t3("2");调用了test3中的方法,先输出了全局变量tt的值为1,这说明第2步中修改的值被保留了,然后输出修改后的值为2;

            总结:综上所述,论证了最开始的猜想。

  • 相关阅读:
    Android Unable to determine activity name
    C专家编程 第6章 运行的诗章:运行时数据结构 6.8 setjmp和longjmp
    【华为OD机试真题 JS】叠积木
    基于Halcon的图像增强算子以及分类例程汇总
    基于Jenkins实现的CI/CD方案
    C#:模式匹配与模式
    135.如何进行离线计算-1
    MATLAB图像处理学习——图像增强技术(附图像增强方法代码)
    WPF 主窗口最大化、最小化、关闭、可拖动
    ubuntu系统arm架构离线部署jq服务
  • 原文地址:https://blog.csdn.net/sxf1061700625/article/details/133422269