Articles of closures

为什么这个JavaScript函数失去封闭范围?

我在node.js中运行这个 为什么下面的代码段会丢失cb var的作用域? Client.prototype.post = function(path, data, callback) { var self = this; var cb = callback; return function() { console.log(path); console.log(cb); rest.post(self.baseUrl + path, data).on('complete', cb || this.callback); } }; 对这个函数的调用如下所示: client.post('/user', {}, function() {}); 并输出以下内容: /user undefined 我期待的第二行是[Function]返回的函数可能是执行任何js的.apply()或.apply()方法来改变它的运行范围。但我认为cb将是就像path一样。 更新:在函数中包装callback使其工作。 但是我仍然想要解释一下这里发生的事情。 var cb = function() { callback(); };

为发出的事件创build侦听器的闭包问题

我已经实现了封装与外部设备交互的驱动程序的对象。 当驱动程序收到数据时,它会发出一个事件。 当我开始时,我加载一个所有定义的驱动程序的列表。 然后我遍历定义来执行以下操作: 创build一个驱动实例, 听取司机的事件 告诉驱动程序连接。 作为发出事件的侦听器的一部分,我定义了一个函数来传递设备代表的一些细节。 但是,我的代码似乎有问题。 当一个驱动程序发出一个事件时,被触发的函数只显示一组细节。 这些细节是在for循环中定义的最后一个,我创build驱动程序并监听事件。 我创build了一个testing示例,通过使用几个简单的对象和计时器来重新创build我的问题。 这将需要在node.js中运行以查看问题。 var EventEmitter = require('events').EventEmitter; var util = require('util'); // define vehicle object function Vehicle(options) { options = options || {}; this.id = ((options.id != null) ? options.id : -1); this.name = ((options.name != null) ? options.name : 'unknown'); } util.inherits(Driver, EventEmitter); // […]

JS编译器同时编写前端和后端代码

我想编写前端和后端之间高度互动的项目。 目前,我正在使用Node.js作为后端,Google Closure作为前端和自己的Swagger类库来发布和使用基于模式的JSON服务。 我不喜欢这种方法,因为这些项目的变化是非本地的,需要大量的testing。 是否有一个JS的变体(或者,可能是一些语言翻译成JS)翻译一个来源(可能有一些@server/@client注释)既前端和后端代码?

在killall nodejs关机挂钩

我试图将一些关机function绑定到我的nodejs应用程序(版本0.8.12)。 由于我正在产生大量的subprocess并在分布式环境中工作,所以我正在通过杀死这个应用程序 var n = spawn('killall', ['node']); 问题是,显然这个on('exit', …)逻辑不再有效,事实上我有这样的东西: process.on('exit', function() { if(exit_cb) exit_cb() else console.log('About to exit.'); }); 而且,只要我杀了应用程序就不会触发。 有没有办法使用killall命令添加一个closures钩子,或者我应该find另一种方法来杀死我的subprocess,以使钩子工作? 谢谢

关于这个和自我在JavaScript中

我知道“自我”的魔力。 但从nodejs(不完整)看这个片段。 Socket.prototype.connect = function(options, cb) { …… var self = this; var pipe = !!options.path; if (this.destroyed || !this._handle) { this._handle = pipe ? createPipe() : createTCP(); initSocketHandle(this); } if (typeof cb === 'function') { self.once('connect', cb); } timers.active(this); self._connecting = true; self.writable = true; …… } 这是我的理解,我们必须用自己来创build一个封闭。 这里没有closures这些行,但作者使用后,分配给自己。 这有什么不同吗?

Nodejs闭包variables没有在模块中更新

我需要一些帮助来理解NodeJs。 我显然缺less一些根本性的东西。 我有一个类似于以下的模块,使用基本的揭示模块模式… var someArray = []; var publicApi = { someArray: someArray, someFunction: someFunction }; function someFunction() { someArray = ['blue', 'green']; } module.exports = publicApi; 当我使用这个模块时,当我调用一些函数时someArray不会被改变… var myModule = require('myModule'); myModule.someFunction(); var test = myModule.someArray; // test is always an empty array 请帮我理解为什么。 我意识到我可以使用构造函数来获得这个工作,但是我想填补我为什么上述不起作用的知识。 更新: 我可以得到这个与模块的以下修改工作… var theModule = { someArray: [], someFunction: […]

NodeJScallback – 访问“res”

我正在使用Express框架,并在我的一个路由文件中有以下内容: var allUsersFromDynamoDb = function (req, res) { var dynamodbDoc = new AWS.DynamoDB.DocumentClient(); var params = { TableName: "users", ProjectionExpression: "username,loc,age" }; dynamodbDoc.scan(params, function (err, data) { if (err) { console.error("Unable to query. Error:", JSON.stringify(err)); res.statusCode = 500; res.send("Internal Server Error"); } else { console.log("DynamoDB Query succeeded."); res.end(JSON.stringify(data.Items)); } }); } 我在我的一个路线中使用上面的函数: router.get('/users', allUsersFromDynamoDb); 现在我在调用dynamodbDoc上的“scan”时定义的callback函数,如果定义为一个单独的函数,可能会非常有用。 […]

循环递增在传递给函数之前进行限制

我有一些代码来复制数组中包含的每个源目标和目标目录在dirs数组中的文件。 每循环一次,它就会调用复制的函数。 它看起来像这样: var filesInEachDir ["file1", "file2", "file3"]; var dirs = [ {"source": "sourceDirectory1", "dest":"destinationDirectory1"}, {"source": "sourceDirectory2", "dest":"destinationDirectory2"}, {"source": "sourceDirectory3" "dest":"destinationDirectory3"}, ]; for (var i = 0; i < dirs.length; i++){ fs.mkdir(dirs[i], function(err){ if(err){ console.log(err); }else{ copyFiles(dirs[i], filesInEachDir); } }); } function copyFiles(dirs, files){ for (var c = 0; c < files.length; c++){ fs.copy(files[c], dirs.source, […]

跟踪完成的JavaScriptcallback没有嵌套function

所以我正在写一个函数,使一堆数据库调用。 我想将它们的结果存储在一个数组中,并在完成之后触发一个callback。 一些伪代码可能会有所帮助: function getStuff (array, callback) { var results = []; var done = 0; for (var i = 0, len = array.length; i < len; i++) { database.fetchOne(array[i], function(result) { results[i] = result; done++; if (done == len) callback(results); }); } } 这很好。 不过,我被告知,在循环中嵌套一个闭包是一个不好的习惯,因为它每次迭代都会定义函数,而且会带来性能上的代价。 其他答案build议将callback移到循环之外: function getStuff (array, callback) { var results = […]

阻止JavaScriptclosuresinheritance范围

我正在寻找一种奇特的方法来防止封闭inheritance周围的sc。。 例如: let foo = function(t){ let x = 'y'; t.bar = function(){ console.log(x); // => 'y' }); }; 我知道防止共享范围的方式只有两种 : (1)使用阴影variables: let foo = function(t){ let x = 'y'; t.bar = function(x){ console.log(x); // => '?' }); }; (2)把函数体放在别的地方: let foo = function(t){ let x = 'y'; t.bar = createBar(); }; 我的问题是 – 有没有人知道的第三种方法,以防止在JSinheritance范围closures? […]