Tag: closures

内存泄漏和NodeJS中的closures问题

当我们开始testing我们的NodeJS项目时,我们注意到了巨大的内存消耗。 这是由我们的项目内存泄漏造成的。 所以我们开始寻找所有可能产生内存泄漏的原因。 在stackoverflow上有这个问题的一些答案,但没有什么是和什么是内存泄漏任何straitforward文件。 我的问题: V8 GC上是否有文档以及它是如何工作的(详细信息)? 如何释放callback,以便GC可以收集它们? V8 GC是否收集了没有使用的variables,但是在它们下面有一个函数闭包? 例: var serviceChannel = require('./channel'); var dataRegistration = require('../data/registration'); function registerOnChannel(userID, channelID, callsuccess, callerror) { serviceChannel.findChannel(channelID, function (channel) { if (!channel) { callerror("Channel doesn' exists"); return; } dataRegistration.registerOnChannel(userID, channelID, function (registration) { if (!registration) { callerror("Registration doesn' exists"); return; } callsuccess("Registration successful"); }, function (error) […]

带closures的循环保存状态

请原谅我,如果这可能是一个noobie问题,但这应该工作不应该吗? var elems = [1,2,3,4,5] for (var i = 0; i <elems.length; i++) { return (function(e){ console.log(e) })(i); } 意思是,它应该吐出来 >>node file.js 1 2 3 4 5 由于某种原因,这不是这样做的。 而当它在terminal运行,它吐出来 >>node file.js 1 我错过了什么? 请您详细说明一下。

节点Gruntasynchronous任务循环与闭合不起作用

预先感谢您看看这个。 我有一个循环中的asynchronous任务不工作。 我已经确定: 将我的循环variables“key”封装在闭包中,以避免经典的“仅限最后一个值”的问题,循环在asynchronous任务返回一个值之前完成很长时间,只显示最后一个值。 调用完成(错误)完成我的asynchronous任务(根据Gruntjs常见问题解答) 使用hasOwnProperty()来确保键是对象的实际属性,而不是来自原型。 遵循node.exec例子的格式,除了把exec的值赋给一个variables – 我试过了,但是没有帮助。 见下面的第一个参考。 这个函数输出…什么都没有! 出于某种原因,grunt.log.writeln语句甚至没有发射。 任务完成没有错误。 我还尝试添加20秒的延迟,以防脚本在asynchronous任务返回之前完成。 奇怪的是,如果我不叫“完成(错误),”文件被写入文件(当我用grunt.file.write语句replacewriteln的)。 var done = this.async(), exec = require('child_process').exec, myJSON = { "file1" : "C:/home/me/jquery.js", "file2 " : "C:/home/me/grunt.js", … "fileN" : "C:/home/me/N.js" }, count; for (var key in myJSON) { if (myJSON.hasOwnProperty(key)) { (function (key) { exec( 'type "' + myJSON[key] […]

用memwatch-node标识内存泄漏

我的Node.js项目遭受内存泄漏,我已经在闭包中设置variables为null,我的意思是,我知道这样的代码: var a = 0; var b = 1; var c = 0; example_func(c, func(){ console.log(b); }); 会造成内存泄漏,所以我添加一些代码来将这些variables设置为null; var a = 0; var b = 1; var c = 0; example_func(c, func(){ console.log(b); a = null; b = null; c = null; }); 但我仍然有泄漏,所以我尝试使用memwatch-node来找出我的代码有什么问题。 结果表明, closure导致泄漏,但没有足够的指定目标。 我有这样的JSON { what: 'Closure', '+': 12521, size: '520.52 kb', […]

通过Javascript / Node中的闭包了解variables捕获

除了标准之外,在JavaScript中是否有variables捕获的确切来源(阅读标准很痛苦)? 在下面的代码中, i被值复制: for (var i = 0; i < 10; i++) { (function (i) { process.nextTick(function () { console.log(i) }) }) (i) } 所以它打印1..10。 process.nextTick是节点中setTimeout(f,0)的模拟。 但在接下来的代码中,我似乎没有被复制: for (var i = 0; i < 10; i++) { var j = i process.nextTick(function () { console.log(j) }) } 它打印9 10次。 为什么? 我对参考文献/一般文章更感兴趣,而不是解释这个具体的捕获案例。

在JavaScript中封闭和callback内存泄漏

function(foo, cb) { var bigObject = new BigObject(); doFoo(foo, function(e) { if (e.type === bigObject.type) { cb(); // bigObject = null; } }); } 上面的例子显示了一个经典的,意外的(或者可能不是)内存泄漏的封闭。 V8垃圾收集器无法确定是否可以安全地删除bigObject因为它正在被多次调用的callback函数中使用。 一种解决方法是在callback函数中的作业结束时将bigObject设置为null 。 但是如果你使用了很多variables(假设有像bigObject这样的bigObject ,并且它们全部用于callback),那么清理这个变成了一个难题。 我的问题是这样的:有没有其他的方式来清理这些使用的variables? 编辑这里有另一个(现实世界)的例子:所以我从MongoDB中获取应用程序,并将其与其他应用程序进行比较。 mongodb的callback函数使用从该callback函数中定义的variables应用程序。 当我从mongodb得到结果后,我也将它作为callback函数返回(因为它是全部asynchronous的,我不能只写回车)。 所以实际上它可能发生,我一直传播callback到源… function compareApplications(application, condition, callback) { var model = database.getModel('Application'); model.find(condition, function (err, applicationFromMongo) { var result = (applicationFromMongo.applicationID == application.applicationID) […]

构build一个NodeJS模块 – variables和方法

我想创build模块来构build我的NodeJS应用程序,但我有点迷路,而且我还没有发现任何东西(有几个小时的search),这是完全明确的主题。 说我想创build一个“用户”模块,从中我可以创build新的用户在我的代码使用类似于: var newUser = new User(); 理想情况下,我需要使用类似于我的代码顶部的模块: var User = require('../lib/user'); 这很好。 问题是,我应该如何构build用户模块? 以下是最好的方法吗? module.exports = function User() { var authorized = false; var username = undefined; var password = undefined; var statistics = undefined; this.authorized = function() { return authorized; } this.username = function() { return username; } this.statistics = function() { return […]

JavaScript将范围传递给另一个函数

是否有可能以某种方式将函数的范围传递给另一个? 例如, function a(){ var x = 5; var obj = {..}; b(<my-scope>); } function b(){ //access x or obj…. } 我宁愿直接访问variables,即不使用任何像this.obj或this.obj ,但只是直接使用x或obj 。