JS是绑定一个obj的状态还是保持对obj的引用?

我的问题是,绑定到一个asynchronous函数的数组似乎并没有更新后续调用该函数,即使bind'ed数组在该函数内更新。

在下面的函数中,我asynchronous调用queryForData几次。 传入全球宣布的历史。 LOG1总是打印出一个空数组,而LOG2总是打印出一个数组,这个迭代是用正确的数据检索的。 但是,它似乎没有连接在其他调用中检索的数组。

请帮忙

exports.callQuery = function(req, res) { var http = require('http'); var history = []; // loop over all entries in "Stocks" collection // and call queryForData Stocks.find(function (err, stocks){ stocks.forEach(function callback(entry){ queryForData(entry, this.history); }.bind({history : history}) ); }); // perform an HTTP request for data and call the callback // function which concats the data arrays together. var queryForData = function(stockData, history) { var options = { host: 'query.blah.com', path: '/blah'+stockData }; var callback = function(response) { var str = ''; //another chunk of data has been received, so append it to `str` response.on('data', function (chunk) { str += chunk; }); //the whole response has been received, so we just print it out here response.on('end', function () { var data = JSON.parse(str); console.log("LOG1: ", this.stocksHistoryData); this.stocksHistoryData = this.stocksHistoryData.concat(data); console.log("LOG2: ", this.stocksHistoryData); }.bind({stocksHistoryData : history}) ); }; http.request(options, callback).end(); }; }; 

concat()返回一个新的数组。 所以,你用一个新的数组覆盖对数组的引用,这个数组在这个函数的作用域之外是不可达的。 它发生在这里:

 this.stocksHistoryData = this.stocksHistoryData.concat(data); 

尝试replace上面的行:

 data.forEach(function(item){ this.stocksHistoryData.push(item); }, this); 

这样你总是build立现有的数组的状态。

我不能帮你debugging你的代码,但我可以回答你提出的问题。 在JavaScript中,对象总是“通过引用”而不是“按值”传递。 所以,根据你的问题,JS绑定保持对obj的引用。

你的问题是,你的queryForData函数甚至从来没有使用this所以它是不相关的,无论你是否绑定任何东西的function。 另外如果你打算使用this.history它将在queryForData函数体内,而不是传递给它的参数。 我相信这个代码应该改变:

 // loop over all entries in "Stocks" collection // and call queryForData Stocks.find(function (err, stocks){ stocks.forEach(function callback(entry){ queryForData(entry, this.history); }.bind({history : history}) ); }); 

对此:

 // loop over all entries in "Stocks" collection // and call queryForData Stocks.find(function (err, stocks){ stocks.forEach(function callback(entry){ queryForData(entry, history); }.bind() ); }); 

这应该工作正常,因为对象(数组是对象)始终在JavaScript中通过引用传递。 这样, queryForData每个调用都会引用作为parameter passing的同一个history对象。