在Node.js中导入机制究竟是如何工作的?



我是Node.js的新手,在学习它的基础知识时,我遇到了一些CJS系统的导入语法和语义,如require(),module.exports等。

现在我有很多关于Node.js内部的问题,但是找不到任何令人信服的答案,可能是因为Node.js仍然是一项相对较新的技术。

Q1)为了实现局部作用域并保持模块私有中的所有全局变量,为什么Node.js使用函数来包装模块的代码?这种局部作用域不能在没有使用函数的情况下实现吗?

Q2)为什么5个参数传递给这个包装函数?为什么它们不能只是包装函数的自由变量,而不是函数的局部变量?

Q3)Node.js如何调用这个包装函数?它似乎是一个匿名函数,据我所知,没有办法调用匿名函数,除非它保存在标识符中或立即调用。

Q4)模块中的所有require()调用是在编译时解析以节省计算时间,还是在运行时解析。

Q1)为了实现局部作用域并保持模块私有中的所有全局变量,为什么Node.js使用函数来包装模块的代码?不使用函数就不能实现这种局部作用域吗?

函数的执行上下文是在JavaScript中创建局部作用域的机制。函数的局部变量在其执行上下文之外不可用,除非您返回它们。这样做的好处是全局作用域不会被来自不同文件的变量污染

Q2)为什么5个参数传递给这个包装函数?为什么它们不能只是包装函数的自由变量而不是函数的局部变量呢?

在每个函数调用中传递的这5个参数有一个不同的实例。

Q3) Node.js如何调用这个包装函数?它似乎是一个匿名函数,据我所知,没有办法调用匿名函数,除非它保存在标识符中或立即调用。

调用require()后会发生多个步骤。关于你的具体问题——当require('file.js')执行期间调用Module.prototype._compile()时,它将file.js的内容包装在一个函数中,然后运行该函数。

Q4)模块中的所有require()调用都在编译时解析为节省计算时间,或者在运行时解析。

模块在第一次调用require()时被缓存。每次调用require('file.js')都会得到file.js的相同实例。

最新更新