This is how Chrome handles functions, and other engines may do different things.
Let's look at this code:
var funcs = [];
for (var i = 0; i < 1000; i++) {
funcs.push(function f() {
return 1;
});
}
for (var i = 0; i < 1000; i++) {
funcs[0]();
}
http://jsfiddle.net/7LS6B/4/
Now, the engine creates 1000 functions.
The individual function itself takes up almost no memory at all (36 bytes in this case), since it merely holds a pointer to a so-called SharedFunctionInfo object, which is basically a reference to the function definition in your source code*. This is called lazy parsing.
Only when you run it frequently does the JIT kick in, and creates a compiled version of the function, which requires more memory. So, funcs[0]
takes up 256 bytes in the end:
*) This is not exactly true. It also holds scope information and the function's name and other metadata, which is why it has a size of 592 bytes in this case.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…