A closure is a computer science term for a package consisting of a function call and any other information (concrete values of arguments, etc.) needed to execute it later, AS IF in the current context.
In OSL, this is the data type of the thing that the shader network hands to the renderer to describe the properties of a surface or volume at a particular point.
You can think of it as a BSDF (although it can include other information that the shader can pass to the renderer). But the BSDF is not evaluated at the time that the shader is run -- instead, the renderer runs it later, and in fact internally there is not a single method associated with it, but rather it knows how to do a number of things, like choose sample directions, evaluate the amount of light scattering from one direction to another (with supplied with those directions), and so on.
An OSL shader can assemble a closure out of built-in "closure primitives" -- a closure may specifically be a weighted sum of the primitives -- but the actual primitives may not (currently) be authored in OSL itself. They are a part of the renderer, largely because their correct and efficient implementation seems to need to reach deeply into the guts of the renderer internals, which is precisely what OSL shaders are NOT supposed to be concerned with. Each renderer will document a number of BSDF closure primitives that it supports, which may vary from renderer to renderer. At present, there is not a strictly dictated list of which BSDF primitives you can count on in OSL, partly because BSDFs are still a hot research topic, with new and better ones getting published all the time. It doesn't seem stable enough to enshrine in the OSL language quite yet.
a closure is an expression or a function call that will be stored along with necessary contextual information... A closure is a generic holder for any type (data or functions)...
Good read: thhube.github.io/tutorials/osl/osl.html $\endgroup$