Abschlüsse eignen sich hervorragend für asynchrone Logik.
Für mich geht es hauptsächlich um die Organisation von Code. Es ist schön, eine Reihe lokaler Funktionen zu haben, um aufzuteilen, was der Code tut.
create: function _create(post, cb) {
// cache the object reference
var that = this;
function handleAll(err, data) {
var rows = data.rows;
var id = rows.reduce(function(memo, item) {
var id = +item.id.split(":")[1];
return id > memo ? id : memo;
}, 0);
id++;
var obj = {
title: post.title,
content: post.content,
id: id,
// refer to the object through the closure
_id: that.prefix + id,
datetime: Date.now(),
type: "post"
}
PostModel.insert(obj, handleInsert);
}
// this function doesn't use the closure at all.
function handleInsert(err, post) {
PostModel.get(post.id, handleGet);
}
// this function references cb and that from the closure
function handleGet(err, post) {
cb(null, that.make(post));
}
PostModel.all(handleAll);
}
Hier ist ein weiteres Beispiel für eine Schließung
var cachedRead = (function() {
// bind cache variable to the readFile function
var cache = {};
function readFile(name, cb) {
// reference cache
var file = cache[name];
if (file) {
return cb(null, file);
}
fs.readFile(name, function(err, file) {
if (file) cache[name] = file;
cb.apply(this, arguments);
});
}
return readFile;
})();
Und noch ein Beispiel
create: function _create(uri, cb, sync) {
// close over count
var count = 3;
// next only fires cb if called three times
function next() {
count--;
// close over cb
count === 0 && cb(null);
}
// close over cb and next
function errorHandler(err, func) {
err ? cb(err) : next();
}
// close over cb and next
function swallowFileDoesNotExist(err, func) {
if (err && err.message.indexOf("No such file") === -1) {
return cb(err);
}
next();
}
this.createJavaScript(uri, swallowFileDoesNotExist, sync)
this.createDocumentFragment(uri, errorHandler, sync);
this.createCSS(uri, swallowFileDoesNotExist, sync);
},
Die Alternative zur Verwendung von Verschlüssen besteht darin, Variablen mithilfe von Variablen in Funktionen zu curryen f.bind(null, curriedVariable)
.
Im Allgemeinen verwendet die asynchrone Programmierlogik jedoch Rückrufe, und die Manipulation des Status in Rückrufen beruht entweder auf Currying oder auf Schließungen. persönlich bevorzuge ich Verschlüsse.
Die Verwendung der prototypischen Vererbung ermöglicht OO? Muss die prototypische Vererbung wirklich mehr als das tun, damit sie als "nützlich" angesehen wird? Es ist ein Vererbungstool, es ermöglicht Vererbung, das ist nützlich genug.