Skip to content

Instantly share code, notes, and snippets.

@pnlybubbles
Last active August 29, 2015 14:22
Show Gist options
  • Save pnlybubbles/a5800b9326a526ef090b to your computer and use it in GitHub Desktop.
Save pnlybubbles/a5800b9326a526ef090b to your computer and use it in GitHub Desktop.
CoffeeScriptでクロージャのテスト
class Runner
constructor: ->
@cbs = []
set: (callback) ->
@cbs.push callback
run: ->
for cb in @cbs
cb()
list = [
name: "Haruka"
age: 16
,
name: "Nadeko"
age: 14
]
# Pattern A
runnerA = new Runner()
for obj in list
runnerA.set ->
console.log "#{obj.name}: #{obj.age}"
# Pattern B
runnerB = new Runner()
list.forEach (obj) ->
runnerB.set ->
console.log "#{obj.name}: #{obj.age}"
# Pattern C
runnerC = new Runner()
for obj in list
((_obj) ->
runnerC.set ->
console.log "#{_obj.name}: #{_obj.age}"
)(obj)
# Pattern D
runnerD = new Runner()
for obj in list
do (obj) ->
runnerD.set ->
console.log "#{obj.name}: #{obj.age}"
runnerA.run()
# =>
# Haruka: 14
# Nadeko: 14
runnerB.run()
# =>
# Haruka: 16
# Nadeko: 14
runnerC.run()
# =>
# Haruka: 16
# Nadeko: 14
runnerD.run()
# =>
# Haruka: 16
# Nadeko: 14
// Generated by CoffeeScript 1.9.2
var Runner, fn, fn1, i, j, k, len, len1, len2, list, obj, runnerA, runnerB, runnerC, runnerD;
Runner = (function() {
function Runner() {
this.cbs = [];
}
Runner.prototype.set = function(callback) {
return this.cbs.push(callback);
};
Runner.prototype.run = function() {
var cb, i, len, ref, results;
ref = this.cbs;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
cb = ref[i];
results.push(cb());
}
return results;
};
return Runner;
})();
list = [
{
name: "Haruka",
age: 16
}, {
name: "Nadeko",
age: 14
}
];
runnerA = new Runner();
for (i = 0, len = list.length; i < len; i++) {
obj = list[i];
runnerA.set(function() {
return console.log(obj.name + ": " + obj.age);
});
}
runnerB = new Runner();
list.forEach(function(obj) {
return runnerB.set(function() {
return console.log(obj.name + ": " + obj.age);
});
});
runnerC = new Runner();
fn = function(_obj) {
return runnerC.set(function() {
return console.log(_obj.name + ": " + _obj.age);
});
};
for (j = 0, len1 = list.length; j < len1; j++) {
obj = list[j];
fn(obj);
}
runnerD = new Runner();
fn1 = function(obj) {
return runnerD.set(function() {
return console.log(obj.name + ": " + obj.age);
});
};
for (k = 0, len2 = list.length; k < len2; k++) {
obj = list[k];
fn1(obj);
}
runnerA.run();
runnerB.run();
runnerC.run();
runnerD.run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment