为什么在第二个示例中我们获得了较强的参考圆,为什么在第一个示例中却没有得到参考圆?
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
// Connection URL
const url = 'mongodb://localhost:27017/?replicaSet=rs'
// Database Name
const dbName = 'test';
// create a client, passing in additional options
const client = new MongoClient(url, {
keepAlive: true,
connectTimeoutMS: 60000,
socketTimeoutMS: 60000,
});
// Use connect method to connect to the server
client.connect(function(err) {
assert.equal(null, err);
console.log("Connected correctly to server");
const db = client.db(dbName);
createCollated(db, function() {
client.close();
});
});
function createCollated(db, callback) {
db.createCollection('acount',
{
'collation' :
{ 'acountnam': 'firstacount' }
},
function(err, results) {
console.log("Collection created.");
callback();
}
);
};
答案 0 :(得分:3)
在第一个示例中,闭包被执行一次,它返回一个String,并且该String被分配了greeting
。没有关闭;什么也没有被捕获。这只是一个匿名函数。如果愿意,您可以摆脱self.
,就像在命名函数中一样。关键是greeting
的类型为String
。
在第二个示例中,greeting
是一个闭包值,它捕获self
。由于self
持有greeting
,而greeting
持有self
,因此存在一个循环。关键是greeting
的类型是() -> String
。几乎可以肯定这是一个错误,因为这不是打算使用lazy
的方式。
({lazy
是Swift中一个很奇怪的功能,可能不是一个好主意,要尽量避免使用它。我尝试尽可能地避免使用它。有几种微妙的方式来错误地使用它,因此被你咬伤也就不足为奇了。)