I prefer use functional and prototypical inheritance over native loops because it's cleaner. And I use MAP because ES6 feature is far more short and useful, though MAP has no side effects. <!-- begin snippet: js hide: false console: true babel: false --> <!-- language: lang-js --> var func = (n) => Array.from(Array(n).keys()).reverse() function staircase(n) { var fun = func(n).map((value, index, arr)=>{ return console.log(' '.repeat(value)+'#'.repeat(index+1)+'\n') }) return fun } staircase(10) <!-- end snippet --> func is a output of a logic: `Array.from(Array(n).keys()).reverse()` that receives `n:integer` parameter. Array.from is a new syntax from ES6, it means that you can fill an array from "here" to "there" ie: `Array.from(0, 6)` returns `[0,1,2,3,4,5,6]` so all the `staircase(n)` return is a output of map of this array. Such array that receive `Array(n).keys()` and reverses it with prototype `reverse()` so that the array could be: `[6,5,4,3,2,1,0]` instead. the map repeat iterate over the array created from `Array.from(Array(n).keys()).reverse()` and return a log for each item such as every item repeats `' '` (blank space) + "#" at the end of this string.