Javascript 导致RangeError的Node.Js模块中变量和模块的作用域:超出了最大调用堆栈大小

Javascript 导致RangeError的Node.Js模块中变量和模块的作用域:超出了最大调用堆栈大小,javascript,node.js,scope,node-modules,Javascript,Node.js,Scope,Node Modules,我遇到了一个奇怪的问题,外部模块被启动了好几次,到达范围错误:经过几次迭代后,最大调用堆栈大小超过了错误 我将使用一个简单的构造来演示导致此错误的原因。问题是如何使这种构造更有效,从而使特定变量不会使内存过载 假设我有一个名为validate的模块。为了简单起见,让我们假设elem不是一个外部模块,而是一个变量: // validate.js var elem = 0; exports.testRun = function() { elem++ console.log(ele

我遇到了一个奇怪的问题,外部模块被启动了好几次,到达
范围错误:经过几次迭代后,最大调用堆栈大小超过了
错误

我将使用一个简单的构造来演示导致此错误的原因。问题是如何使这种构造更有效,从而使特定变量不会使内存过载

假设我有一个名为
validate
的模块。为了简单起见,让我们假设
elem
不是一个外部模块,而是一个变量:

// validate.js

var elem = 0;

exports.testRun = function() {
    elem++
    console.log(elem)
}
如果我从我的应用程序的另一个地方启动它(从
run.js
):

这是有道理的

但是,现在想象一下,我将
run.js
放入一个模块中,并从应用程序的另一个位置运行它-在这种情况下,由于某种原因,我的变量会增加,我不理解:

// validate.js

var elem = 0;

exports.testRun = function() {
    elem++
    console.log(elem)
}
// end of validate.js


// run.js
 
var validate = require('validate')

exports.otherRun = function () {
  for (let i = 0; i < 5; i++) {
    validate.testRun()
  }
}

// end of run.js


// new.js

var otherone = require('./run')

for (let i = 0; i < 5; i++) {
    otherone.otherRun()
}

// end of new.js

这也是有意义的,因为变量是在全局范围内定义的,实际上需要一次,然后再重复

但是,现在有一个问题:声明这个变量(不在模块之间发送)的最有效方法是什么,这样每次启动
new.js
中的循环时它都会被重置?然后,输出将是
1234512345


我问这个问题是因为我遇到了一些需要声明为变量的外部模块的问题,在处理循环时,我发现它们会运行到
RangeError:超过了最大调用堆栈大小。因此,我试图了解在模块/导出函数中我应该在何处声明它们以获得最大效率。

将当前
for
循环索引传递到
testRun
,如果它是
0
,则将
elem
设置为
0
。我通常也建议从
var
切换到
let
。见下文:

// validate.js

let elem
exports.testRun = function(i) {
    if (i === 0) {
      elem = 0
    } else {
      elem++
    }
    console.log(elem)
}

// run.js
 
let validate = require('validate')

exports.otherRun = function () {
  for (let i = 0; i < 5; i++) {
    validate.testRun(i)
  }
}
//validate.js
让埃伦
exports.testRun=函数(i){
如果(i==0){
元素=0
}否则{
元素++
}
控制台日志(elem)
}
//run.js
让validate=require('validate')
exports.otherRun=函数(){
for(设i=0;i<5;i++){
validate.testRun(i)
}
}

超出
最大调用堆栈大小的
错误可能是递归的结果,而不是循环本身,尽管
while
循环无限运行也可能导致这种情况。(出于这个原因,我尽可能使用
进行
循环。)关于这一点,可以找到一个非常好、彻底的讨论。如果没有额外的代码示例,就不可能给出更多的细节,因为这个答案的最早部分是针对您提供的特定案例的。

当然,这将是实现这一点的一种方法,但我的问题是关于Node.js中模块的使用的更一般的问题。在这种情况下,您可能需要重新措辞您原来的帖子,因为你直接提出的问题就是上面回答的问题。既然你已经澄清了,我会更新我的答案。
// validate.js

var elem = 0;

exports.testRun = function() {
    elem++
    console.log(elem)
}
// end of validate.js


// run.js
 
var validate = require('validate')

exports.otherRun = function () {
  for (let i = 0; i < 5; i++) {
    validate.testRun()
  }
}

// end of run.js


// new.js

var otherone = require('./run')

for (let i = 0; i < 5; i++) {
    otherone.otherRun()
}

// end of new.js

1
2
3
...
25
// validate.js

let elem
exports.testRun = function(i) {
    if (i === 0) {
      elem = 0
    } else {
      elem++
    }
    console.log(elem)
}

// run.js
 
let validate = require('validate')

exports.otherRun = function () {
  for (let i = 0; i < 5; i++) {
    validate.testRun(i)
  }
}