应用程序不改变范围
我想使用JavaScript .apply方法来编译Node.js节点的函数。 thrift .js文件的代码如下所示:
... var NimbusClient = exports.Client = function(output, pClass) { this.output = output; this.pClass = pClass; this.seqid = 0; this._reqs = {}; }; NimbusClient.prototype = {}; NimbusClient.prototype.getClusterInfo = function(callback) { this.seqid += 1; // line where error is thrown [0] this._reqs[this.seqid] = callback; this.send_getClusterInfo(); }; ...
我的服务器文件看起来如下所示:
var thrift = require('thrift') , nimbus = require('./Nimbus') , connection = thrift.createConnection('127.0.0.1', 6627) , client = thrift.createClient(nimbus, connection) , ... // server initiation etc app.get('/nimbus/:command', function(req, res, next) { client[req.params.command](console.log); // direct call [1] client[req.params.command].apply(this, [console.log]); // apply call [2] }); ...
直接调用[1]按预期返回值,但应用调用[2]总是在行[0]中产生以下错误:
TypeError: Cannot set property 'NaN' of undefined
我在[2]中尝试了几个其他范围参数: null
, nimbus
, nimbus.Client
, nimbus.Client.prototype
, nimbus.Client.prototype[req.params.command]
和client[req.params.command]
,都没有成功。
如何在不改变被调用函数的实际范围的情况下调用apply方法,使其与直接调用时的行为完全相同?
将apply
函数指向这样的函数应保留原始范围。
client[req.params.command].apply(client, [console.log]);