Ну, до меня уже все написали, но попробую по-другому, вдруг так понятно будет.
Суть замыканий в том, что вокруг функции
замыкается ее контекст - окружение, в котором она была написана (именно написана, а не вызвана, поэтому еще иногда замыкания называют подробнее - замыкания лексического контекста). Это означает, что она всегда "видит" переменные, имеющиеся в этом контексте, даже если вызывается в совершенно других местах, где этими переменными и не пахнет.
В данном примере у вас
function(x)
замкнута в контексте функции
inBetween(a, b)
и поэтому будет всегда видеть переменные a и b.
--
И выходит, что переменная val является параметром function(x)
Это уже не про замыкания, это больше про функции высшего порядка.