Я сталкивался с той же проблемой. В следующем коде замыкание, связанное с fun, должно содержать только одну переменную с именем result. Когда код стоит, переменная result в функции с одним параметром, похоже, отличается от переменной результата в замыкании.
Если в этой функции строка
result = [];
удаляется, затем результат в строке
return result;
относится к результату в закрытии.
var fun = function() {
var result = [];
// recursive descent, collects property names of obj
// dummy parameter does nothing
var funAux = function(obj, pathToObj, dummy) {
if (typeof obj === "object") {
for (var propName in obj) {
if (obj.hasOwnProperty(propName)) {
funAux(obj[propName], pathToObj.concat(propName), dummy);
}
}
}
else {
// at leaf property, save path to leaf
result.push(pathToObj);
}
}
return function(obj) {
// remove line below and `result' 3 lines below is `result' in closure
result = []; // does not appear to be bound to `result' above
funAux(obj, [], "dummy");
return result; // if result 2 lines above is set, result is closure is a different variable
};
}();