Closure (computer programming)In computer science, a closure is a function that has an environment of its own. In this environment, there is at least one bound variable (a name that has a value, such as a number). The closure's environment keeps the bound variables in memory between uses of the closure. Peter J. Landin gave this idea the name closure in 1964. The Scheme programming language made closures popular after 1975. Many programming languages made after that time have closures. Anonymous functions (functions with no name) are sometimes wrongly called closures. Most languages that have anonymous functions also have closures. An anonymous function is also a closure if it has an environment of its own with at least one bound variable. An anonymous function with no environment of its own is not a closure. A named closure is not anonymous. Closures and first-class functionsValues may be numbers or some other type of data, such as letters, or data structures made up of simpler parts. In the rules of a programming language, the first-class values are values that can be given to functions, returned by functions, and bound to a variable name. Functions that take or return other functions are called higher-order functions. Most languages that have functions as first-class values also have higher-order functions and closures. For example, take a look at the following Scheme function: ; Return a list of all books with at least THRESHOLD copies sold.
(define (best-selling-books threshold)
(filter
(lambda (book) (>= (book-sales book) threshold))
book-list))
In this example, the lambda expression The Here is the same example rewritten in ECMAScript (JavaScript), a popular language with support for closures: // Return a list of all books with at least 'threshold' copies sold.
function bestSellingBooks(threshold) {
return bookList.filter(
function(book) { return book.sales >= threshold; }
);
}
ECMAScript uses the word A function may create a closure and return it. The following example is a function that returns a function. In Scheme: ; Return a function that approximates the derivative of f
; using an interval of dx, which should be appropriately small.
(define (derivative f dx)
(lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
In ECMAScript: // Return a function that approximates the derivative of f
// using an interval of dx, which should be appropriately small.
function derivative(f, dx) {
return function(x) {
return (f(x + dx) - f(x)) / dx;
};
}
The closure environment keeps the bound variables A closure need not be formed using an anonymous function. The Python programming language, for example, has limited support for anonymous functions but does have closures. For example, one way the above ECMAScript example could be implemented in Python is: # Return a function that approximates the derivative of f
# using an interval of dx, which should be appropriately small.
def derivative(f, dx):
def gradient(x):
return (f(x + dx) - f(x)) / dx
return gradient
In this example, the function named gradient makes a closure together with the variables f and dx. The outer enclosing function named derivative returns this closure. In this case, an anonymous function would work also. def derivative(f, dx):
return lambda x: (f(x + dx) - f(x)) / dx
Python must often use named functions instead because its lambda expressions may only contain other expressions (code that returns a value) and not statements (code that has effects but no value).[2] But in other languages, such as Scheme, all code returns a value; in Scheme, everything is an expression. Uses of closuresClosures have many uses:
In Scheme (define foo #f)
(define bar #f)
(let ((secret-message "none"))
(set! foo (lambda (msg) (set! secret-message msg)))
(set! bar (lambda () secret-message)))
(display (bar)) ; prints "none"
(newline)
(foo "meet me by the docks at midnight")
(display (bar)) ; prints "meet me by the docks at midnight"
Note: Some speakers call any data structure that binds a lexical environment a closure, but the term usually refers specifically to functions. References
|
Portal di Ensiklopedia Dunia