为什么在第二个示例中出现保留圈?

时间:2019-02-05 19:27:14

标签: swift closures retain-cycle

为什么在第二个示例中我们获得了较强的参考圆,为什么在第一个示例中却没有得到参考圆?

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();
    }
  );
};

1 个答案:

答案 0 :(得分:3)

在第一个示例中,闭包被执行一次,它返回一个String,并且该String被分配了greeting。没有关闭;什么也没有被捕获。这只是一个匿名函数。如果愿意,您可以摆脱self.,就像在命名函数中一样。关键是greeting的类型为String

在第二个示例中,greeting是一个闭包值,它捕获self。由于self持有greeting,而greeting持有self,因此存在一个循环。关键是greeting的类型是() -> String。几乎可以肯定这是一个错误,因为这不是打算使用lazy的方式。

({lazy是Swift中一个很奇怪的功能,可能不是一个好主意,要尽量避免使用它。我尝试尽可能地避免使用它。有几种微妙的方式来错误地使用它,因此被你咬伤也就不足为奇了。)