Object.defineProperty get / set closure

Ok, próbuję utworzyć nowy obiekt w ten sposób:

var src = {a:'a', b:'b', c:'c'};
var out = {};
for(var prop in src){   
    Object.defineProperty(out, prop,{
        get: function(){
            return src[prop];
        },
        set: function(val){
            src[prop]=val;
        }
    })
}

I uzyskaj zły wynik:

out = {a:'c', b:'c', c:'c'}

Znam inne sposoby tworzenia tego obiektu, tak jak:

for (var prop in src) {
    (function(prop) {
        Object.defineProperty(out, prop, {
            get: function() {
                return src[prop];
            },
            set: function(val) {
                src[prop] = val;
            }
        })
    })(prop)
}

lub:

Object.keys(src).map(function(prop){
    Object.defineProperty(out, prop,{
        get: function(){
            return src[prop];
        },
        set: function(val){
            src[prop]=val;
        }
    })
})

Ale nie mogę zrozumieć, dlaczego w pierwszej metodzie parametr string „prop” zostanie wysłany do funkcji „defineProperty” przez link. Pomóż mi to zrozumieć. Przepraszam, za słaby angielski.

questionAnswers(1)

yourAnswerToTheQuestion