# memoize > Memoize a function.
## Usage ```javascript var memoize = require( '@stdlib/utils/memoize' ); ``` #### memoize( fcn\[, hashFunction] ) Memoizes a function. ```javascript var randu = require( '@stdlib/random/base/randu' ); function rand( n ) { return n * randu(); } var memoized = memoize( rand ); var v1 = memoized( 5 ); var v2 = memoized( 5 ); var bool = ( v1 === v2 ); // returns true ``` By default, the implementation serializes provided arguments as a `string` and stores results using the `string` as an identifier. To use a custom hash function, provide a hash function argument. ```javascript function add( obj ) { return obj.x + obj.y + obj.z; } obj = { 'x': 3, 'y': 4, 'z': 5 }; // Default behavior... var memoized = memoize( add ); var v1 = memoized( obj ); // returns 12 var str = obj.toString(); // returns '[object Object]' var v2 = memoized.cache[ str ]; // returns 12 obj.x = 1000; var v3 = memoized( obj ); // returns 12 // Custom hash function... function hashFunction( args ) { return JSON.stringify( args ); } memoized = memoize( add, hashFunction ); v1 = memoized( obj ); // returns 1009 str = hashFunction( [ obj ] ); // returns '[{"x":1000,"y":4,"z":5}]' v2 = memoized.cache[ str ]; // returns 1009 obj.x = 6; v3 = memoized( obj ); // returns 15 ``` #### memoized.cache Results cache. Note that, while the property is **read-only**, cache contents may be modified independently of the memoized function. ```javascript function beep( x ) { throw new Error( 'boop' ); } var memoized = memoize( beep ); var cache = memoized.cache; // returns {} // Modify the cache: cache[ 'bop' ] = 'bip'; var str = memoized( 'bop' ); // returns 'bip' ```
## Notes - The implementation does **not** set the `length` of the returned function. Accordingly, the returned function `length` is **always** `0`. - The evaluation context is **always** `null`.
## Examples ```javascript var randu = require( '@stdlib/random/base/randu' ); var floor = require( '@stdlib/math/base/special/floor' ); var memoize = require( '@stdlib/utils/memoize' ); var fcn; var n; var v; var i; function rand( n ) { return n * randu(); } fcn = memoize( rand ); for ( i = 0; i < 100; i++ ) { n = floor( randu() * 5 ); v = fcn( n ); console.log( 'rand(%d) = %d', n, v ); } ```