8.3. Functions as DataThe most important features of functions are that they can be defined and invoked, as shown in the previous section. Function definition and invocation are syntactic features of JavaScript and of most other programming languages. In JavaScript, however, functions are not only syntax but also data, which means that they can be assigned to variables, stored in the properties of objects or the elements of arrays, passed as arguments to functions, and so on.[*]
To understand how functions can be JavaScript data as well as JavaScript syntax, consider this function definition: function square(x) { return x*x; } This definition creates a new function object and assigns it to the variable square. The name of a function is really immaterial; it is simply the name of a variable that refers to the function. The function can be assigned to another variable and still work the same way: var a = square(4); // a contains the number 16 var b = square; // Now b refers to the same function that square does var c = b(5); // c contains the number 25 Functions can also be assigned to object properties rather than global variables. When you do this, they're called methods: var o = new Object; o.square = function(x) { return x*x; } // function literal y = o.square(16); // y equals 256 Functions don't even require names at all, as when they're assigned to array elements: var a = new Array(3); a[0] = function(x) { return x*x; } a[1] = 20; a[2] = a[0](a[1]); // a[2] contains 400 The function-invocation syntax in this last example looks strange, but it is still a legal use of the JavaScript () operator! Example 8-2 is a detailed example of the things that can be done when functions are used as data. It demonstrates how functions can be passed as arguments to other functions. This example may be a little tricky, but the comments explain what is going on; it is worth studying carefully. Example 8-2. Using functions as data
If the preceding example does not convince you of the utility of being able to pass functions as arguments to other functions and otherwise treat functions as data values, consider the Array.sort() function. This function sorts the elements of an array. Because there are many possible orders to sort by (numerical order, alphabetical order, date order, ascending, descending, and so on), the sort() function optionally takes another function as an argument to tell it how to perform the sort. This function has a simple job: it takes two elements of the array, compares them, and then returns a value that specifies which element comes first. This function argument makes the Array.sort() method perfectly general and infinitely flexible; it can sort any type of data into any conceivable order! (An example using Array.sort() is in Section 7.7.3.) |