Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript commonjs在导出和请求过程中如何制作两个副本?_Javascript_Module_Commonjs - Fatal编程技术网

Javascript commonjs在导出和请求过程中如何制作两个副本?

Javascript commonjs在导出和请求过程中如何制作两个副本?,javascript,module,commonjs,Javascript,Module,Commonjs,我从中了解了CommonJS,但在理解以下代码方面遇到了困难: 在本例中,我们基本上制作了模块的两个副本:一个是 我们出口它,当我们需要它的时候,我们就出口一个。此外,副本 main.js现在已与原始模块断开连接。这就是为什么 当我们增加计数器时,它仍然返回1 — 因为柜台 我们导入的变量是计数器的断开连接的副本 来自模块的变量 因此,如果创建了两个副本,那么每个副本不都有自己版本的计数器和增量?因此,每一个都将连接到它们自己的增量?作者说module.exports中有一个计数器、增量、和减量

我从中了解了CommonJS,但在理解以下代码方面遇到了困难:

在本例中,我们基本上制作了模块的两个副本:一个是 我们出口它,当我们需要它的时候,我们就出口一个。此外,副本 main.js现在已与原始模块断开连接。这就是为什么 当我们增加计数器时,它仍然返回1 — 因为柜台 我们导入的变量是计数器的断开连接的副本 来自模块的变量


因此,如果创建了两个副本,那么每个副本不都有自己版本的
计数器
增量
?因此,每一个都将连接到它们自己的
增量
?作者说module.exports中有一个
计数器
增量
、和
减量
,另一个副本在
var counter=require(“../../lib/counter”)中
因此,
计数器.increment
不应该调用require copy和
控制台.log(counter.counter)中的
increment
函数
在require copy中返回已连接的计数器?

我认为这句话是为了对比ES6模块和nodejs CommonJS模块。这并不完全正确

当你需要一个模块时,这里有一些你需要了解的东西

require
在幕后是如何工作的

简而言之,执行并缓存调用
require
所需的模块代码。 在执行模块代码之前,Node.js将使用函数包装器()对其进行包装。这确保了顶级变量(如计数器)作用域为模块,而不是全局对象。这意味着,如果导出要在另一个模块中使用的函数,它可以作为与模块中声明的变量相关的函数。最后返回
module.exports
的内容

对于基本类型和对象类型,值赋值是如何发生的

让我们看看
lib/counter.js的
模块.exports
您将看到它正在导出一个原语值(
计数器
)加上两个函数(
递增
递减
)。
计数器
作为原语值由其值复制,即数字1被设置为
模块的值。exports.counter
而递增和递减(都是一级对象)通过其引用进行复制。实际上,
module.exports.increment
module.exports.decreation
都是与其主体内使用的
计数器
变量相关的闭包。 您可以在post中阅读有关基本体与对象分配的更多信息

最后,在
main.js
中,
counter
变量(从计数器中获取module.exports的内容)是一个具有以下键的对象

  • 计数器-它是number类型的基元值
  • 增量-它是指向闭包的指针
  • 减量-它也是一个指向闭包的指针

  • 因此,您可以看到函数中的计数器变量是指计数器模块中定义的变量。由于
    counter.counter
    值仅通过其值导出,因此对其进行的任何操作都不会对原始模块变量产生影响。

    我认为该声明是为了实现ES6模块之间的对比vs nodejs CommonJS模块。它不完全正确

    当你需要一个模块时,这里有一些你需要了解的东西

    require
    在幕后是如何工作的

    简而言之,执行并缓存调用
    require
    所需的模块代码。 在执行模块代码之前,Node.js将使用函数包装器()对其进行包装。这确保了顶级变量(如计数器)作用域为模块,而不是全局对象。这意味着,如果导出要在另一个模块中使用的函数,它可以作为与模块中声明的变量相关的函数。最后返回
    module.exports
    的内容

    对于基本类型和对象类型,值赋值是如何发生的

    让我们看看
    lib/counter.js的
    模块.exports
    您将看到它正在导出一个原语值(
    计数器
    )加上两个函数(
    递增
    递减
    )。
    计数器
    作为原语值由其值复制,即数字1被设置为
    模块的值。exports.counter
    而递增和递减(都是一级对象)通过其引用进行复制。实际上,
    module.exports.increment
    module.exports.decreation
    都是与其主体内使用的
    计数器
    变量相关的闭包。 您可以在post中阅读有关基本体与对象分配的更多信息

    最后,在
    main.js
    中,
    counter
    变量(从计数器中获取module.exports的内容)是一个具有以下键的对象

  • 计数器-它是number类型的基元值
  • 增量-它是指向闭包的指针
  • 减量-它也是一个指向闭包的指针
  • 因此,您可以看到函数中的计数器变量是指计数器模块中定义的变量。由于
    counter.counter
    值仅通过其值导出,因此对其进行的任何操作都不会对原始模块变量产生影响

    // lib/counter.js
    
    var counter = 1;
    
    function increment() {
      counter++;
    }
    
    function decrement() {
      counter--;
    }
    
    module.exports = {
      counter: counter,
      increment: increment,
      decrement: decrement
    };
    
    
    // src/main.js
    
    var counter = require('../../lib/counter');
    
    counter.increment();
    console.log(counter.counter); // 1