我是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
的相同实例。