As ncphillips said, Closure isn't a js type. It's a data structure designs to solve the dynamic scope problem. You can take a look at this link : https://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scope_vs._dynamic_scope
In most functional programming language, the closure is transparent to the developer, there isn't a way to visit or control this structure.
Every time the vm create a closure(commonly happens when you declare a function), it looks up the scope chain and 'make a link to them (that's my word, maybe not very clear)'. In your code :
var f1 = function(){return k;};
var f2 = (function(k){return function(){return k;}})(42);
You can see, the function that f1 ref to and the function f2 ref to have different scope chain, although they both return k, but what k refs to isn't the same area. It's not saying that if f2 or f1 is a closure, they are both function, they both have their closure, but in this example, they don't ref to the same closure.
They both return k, when they do that, they will look inside their closure ( more or less equals their scope chain)to find the 'k'. For f1, you didn't give it a 'k' in this code, so it keep look up, until global, if still hasn't a 'k', then return undefined. For f2, the scope in function(k){}
is f2's 'lowest scope', and it found a 'k', so return it. This is the difference.
The keyword of closure creation is function declare, when the vm declare a function, it give the function a closure, rely on the scope that the declaration happens.
My English isn't good, just hope this can help you.