m0_67040484 2023-02-16 15:01 采纳率: 0%
浏览 17

前端commonjs模块化

在学习commonjs模板化规范的时候,看到大家经常在说的一句话,即导出是值的拷贝,无法通过模块内部去改变属性值。
然后给出以下代码块讲解

// a.js
var name = 'morrain'
var age = 18
exports.name = name
exports.age = age
exports.setAge = function(a){
    age = a
}
// b.js
var a = require('a.js')
console.log(a.age) // 18
a.setAge(19)
console.log(a.age) // 18


我不是很明白这边值的拷贝跟无法通过模块内部去改变属性值有什么必然联系
就不懂为什么a.setAge(19)改不了

  • 写回答

3条回答 默认 最新

  • Evaporator Core 2023-02-16 15:11
    关注

    在 CommonJS 模块化规范中,每个模块都是独立的作用域,可以有自己的变量和函数,但是模块内部的变量和函数都是私有的,外部无法直接访问,需要通过 exports 或 module.exports 导出才能让其他模块使用。

    在上面的代码块中,a.js 中导出的 age 变量和 setAge 函数都被存储在 exports 对象中,即 exports.age 和 exports.setAge,它们都是对 age 变量的引用。当其他模块(如 b.js)引用 a.js 时,通过 var a = require('a.js') 获取到的对象 a 中,a.age 和 a.setAge 也都是对 age 变量的引用。

    当 a.setAge(19) 执行时,它改变的是 a.js 模块内部的 age 变量,而不是外部通过 require 获取到的 a 对象中的 age 变量。因为在 CommonJS 模块化规范中,每个模块都有自己的作用域,模块内部的变量和函数都是私有的,外部无法直接访问。因此,a.setAge(19) 改变的是 a.js 模块内部的 age 变量,而不是外部通过 require 获取到的 a 对象中的 age 变量。因此,console.log(a.age) 的输出仍然是 18,而不是预期的 19。

    总之,虽然变量是通过引用传递的,但是通过 exports 导出的变量只是对原始变量的引用,并不是原始变量本身。在其他模块中对这些变量进行修改时,只是修改了对原始变量的引用,而不是原始变量本身。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月16日

悬赏问题

  • ¥15 思科模拟器Router c3600 NM-4E
  • ¥15 岛津txt格式文件转nirs格式
  • ¥15 石墨烯磁表面等离子体
  • ¥15 angular 项目无法启动
  • ¥15 安装wampserver,图标绿色,但是无法进入软件
  • ¥15 C++ MFC 标准库 加密解密解惑
  • ¥15 两条数据合并成一条数据
  • ¥15 Ubuntu虚拟机设置
  • ¥15 comsol三维模型中磁场为什么没有“速度(洛伦兹项)”这一选项
  • ¥15 electron 如何实现自定义安装界面