Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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 函数中的变量是如何以及何时被销毁的?_Javascript_Node.js - Fatal编程技术网

Javascript 函数中的变量是如何以及何时被销毁的?

Javascript 函数中的变量是如何以及何时被销毁的?,javascript,node.js,Javascript,Node.js,我已经成功地实现了一个功能,但无法准确地掌握概念,请一些指导 假设我在服务器启动时创建了一个函数 server.js: const bookRefs = ["123","345","121"] bookRefs.forEach(e=>{ schedulerFunc(e) }) exports.schedulerFunc = async (bookRef) => { const bookDetails =

我已经成功地实现了一个功能,但无法准确地掌握概念,请一些指导

假设我在服务器启动时创建了一个函数

server.js:

const bookRefs = ["123","345","121"]

bookRefs.forEach(e=>{
    schedulerFunc(e)
})
exports.schedulerFunc = async (bookRef) => {
    const bookDetails = await Book.find({ book_ref: bookRef }).exec()
    console.log(bookDetails) => [{"bookName":"Hobbit","author":"RR 
Tolkein"},{"bookName":"Harry potter","author":"JK Rowling"}]
    for (let i = 0; i < bookDetails.length; i++) {
            schedule.scheduleJob('*****'//for everyminute, async () => {
                console.log(bookDetails[i].bookname)
            }
    }
}
schedulerFunc位于controller.js:

const bookRefs = ["123","345","121"]

bookRefs.forEach(e=>{
    schedulerFunc(e)
})
exports.schedulerFunc = async (bookRef) => {
    const bookDetails = await Book.find({ book_ref: bookRef }).exec()
    console.log(bookDetails) => [{"bookName":"Hobbit","author":"RR 
Tolkein"},{"bookName":"Harry potter","author":"JK Rowling"}]
    for (let i = 0; i < bookDetails.length; i++) {
            schedule.scheduleJob('*****'//for everyminute, async () => {
                console.log(bookDetails[i].bookname)
            }
    }
}
exports.schedulerFunc=async(bookRef)=>{
const bookDetails=wait Book.find({Book\u ref:bookRef}).exec()
log(bookDetails)=>[{“bookName”:“霍比特人”,“作者”:“RR
托尔金,{“书名”:“哈利波特”,“作者”:“JK罗琳”}]
for(设i=0;i{
console.log(bookDetails[i].bookname)
}
}
}
一切正常,但我不明白的是,当服务器启动时,它调用schedulerFunc(e)对于每个bookRefs,在调用scheduleJob之后,它第一次像它应该的那样工作,并且像它应该的那样打印书籍的名称,但是在再次触发5分钟scheduleJob之后,它打印书籍的名称,即使这次我们没有获取bookDetails,它也只获取了一次,scheduleJob能够打印书籍的名称一次又一次。为什么它不抛出错误bookDetails[i]。找不到bookname


如果有人需要更多详细信息,请告诉我。

只要您的一个或多个
scheduleJob()
函数调用仍在等待调用其回调,那么回调中的代码仍可以访问该回调范围内的所有内容,因此该回调中的代码引用的任何内容都将保持活动状态,并且在调用
scheduleJob()之前不会被垃圾回收器清除
回调已完成,无法再次调用


您会注意到这种情况(称为关闭)发生这种情况的原因是回调声明为内联,因此其代码可以查看和引用父作用域中的变量。如果回调未声明为内联,只是作为对外部函数定义的引用传递,则它将无法访问父作用域中的变量,并且这些变量可能会尽快被垃圾收集当
for
循环完成时。

只要一个或多个
scheduleJob()
函数调用仍在等待调用其回调,那么回调中的代码仍可以访问该回调范围内的所有内容,因此该回调中的代码引用的任何内容都将保持活动状态,并且在调用
scheduleJob()之前不会被垃圾回收器清除
回调已完成,无法再次调用


您会注意到这种情况(称为关闭)发生这种情况的原因是回调声明为内联,因此其代码可以查看和引用父作用域中的变量。如果回调未声明为内联,只是作为对外部函数定义的引用传递,则它将无法访问父作用域中的变量,并且这些变量可能会尽快被垃圾收集由于的
循环已经完成。

对不起,我不理解您的倒数第二段。如果您用实际代码进行说明,然后参考特定的代码行或
console.log()
您正在询问的语句。如果您询问的是问题中包含的实际代码,则此处的问题会更好。伪代码或我们看不到您真正询问的内容的小片段在此处的效果不太好。非常抱歉……我将编辑我的问题。仍在等待您添加实际代码e、 但从概念上讲,Javascript中的变量只要有一些活动代码仍然可以引用它就可以使用。垃圾收集器搜索那些可操作代码无法访问的变量,然后将其清除。抱歉,我不得不执行一些任务……我已编辑了问题,请查看……因此,除非我退出删除实际触发的函数变量将存在且不会被破坏?附言:感谢您花时间回答。抱歉,但我不理解您的第二段至最后一段。如果您用实际代码进行说明,然后参考特定代码行或
console.log()
您正在询问的语句。如果您询问的是问题中包含的实际代码,则此处的问题会更好。伪代码或我们看不到您真正询问的内容的小片段在此处的效果不太好。非常抱歉……我将编辑我的问题。仍在等待您添加实际代码e、 但从概念上讲,Javascript中的变量只要有一些活动代码仍然可以引用它就可以使用。垃圾收集器搜索那些可操作代码无法访问的变量,然后将其清除。抱歉,我不得不执行一些任务……我已编辑了问题,请查看……因此,除非我退出删除实际已触发的函数变量将存在且不会被销毁?附言:感谢您花时间回答。抱歉,我不明白您所说的回调是内联声明的…这是否意味着它在启动时触发的函数内?您是否可以提供一些\文档我可以引用的?@SivaPradhan-如果您想了解垃圾收集器的工作原理,Javascript中有一个关于垃圾收集器的详细信息。@SivaPradhan-是的,这意味着回调函数体位于函数作用域内,这意味着它可以直接访问父函数中的变量。这被称为“词法作用域”如果您想了解更多有关该概念的信息。如果回调函数体是在外部声明的,而回调函数只是作为函数名传递的,那么该回调函数将无法访问父函数中的变量。很抱歉,我