Лень объяснять, лучше посмотри, как меняются переменные
function withEmu( object, f ) {
var argumentNamesArray = [], // массив имен
argumentValuesArray = [], // массив значений
newF;
for( var arg in object ) {
argumentNamesArray.push( arg ); // "a", "b", "c"
argumentValuesArray.push( object[ arg ] ); // "1", "2", "blah"
}
argumentNamesArray.push( 'return (' + f + ')()' ); // "a", "b", "c", "return (function() {return [a,b,c];})()"
newF = Function.apply( null, argumentNamesArray ); // то же самое, что и
//Function("a", "b", "c", "return (function() {return [a,b,c];})()") или
//function(a,b,c){ return (function() {return [a,b,c];})() }
return newF.apply( null, argumentValuesArray ); // вызываем её с аргументами "1", "2", "blah"
}
var x = withEmu( {a:1, b:2, c: 'blah'}, function() {
return [a,b,c];
});
alert( x );