2011-08-29 6 views
5

Actualmente la mayor parte de mi trabajo está relacionado con el desarrollo de js.cuántas copias de la función interna se crearán

Sin embargo, de repente descubrí que estoy confundido con algunas preguntas.

Comprobar el código (añado un método de una clase personalizada):

MyCustomClass.prototype.fun=function(xx){ 
    this.options={.....} 
    function innerFun01(){} 
    function innerFun02(){} 
} 

Ahora, lo utilizan.

var mcc=new MyCustomClass(); 
mcc.fun(xxxx); 

var mcc2=new MyCustomClass(); 
mcc2.fun(xxxx); 

Ahora, me pregunto cuántas copias de la función "innerFun01" y "innerFun02" se creará en la memoria?

Estoy realmente confundido.

Respuesta

5

Esas funciones se construirán cada vez que se llame a la función "diversión". (Supongo que es más correcto decir que nuevas instancias de esas funciones se construirán.)

Está bien. Los modernos sistemas de tiempo de ejecución de JavaScript son bastante buenos. Es posible que la traducción del código fuente en ... bueno sea lo que sea (thunks, código de máquina, código enhebrado, ...) se haga cuando la función externa se analiza primero, de modo que la "instanciación" real de las funciones sea realmente barato.

Muchos idiomas funcionales tienen características similares. Una función de Esquema local declarada con un (let ...) o algo similar se generaría cada vez que se llama a su función contenedora.

+0

¿Es esto una pérdida de memoria? alguna idea para cambiarlos? Pero no quiero definirlos fuera, ya que no quiero exponerlos. – hguser

+1

No es realmente un desperdicio de memoria. Se crean instancias, pero luego se descartan después de que se ejecuta el método 'diversión'. El recolector de basura de JavaScript vendrá poco después y los recogerá y los arrojará. – Stephen

+1

Joe Armstrong, la luminaria de Erlang, responde a tales preocupaciones sobre problemas con ese lenguaje instando a los desarrolladores a "escribir el código más bonito" que puedan. Escriba código que sea * algorítmicamente * sonido, y solo preocúpese por tales cosas en casos extremos (improbables). – Pointy

0

Una regla simple ayuda a aclarar su confusión: las funciones de JavaScript son objetos funcionales. Y todos sabemos en el cuerpo de la función que las variables locales se instancian cada vez que se invoca la función. Dados los dos, la respuesta es obvia: las funciones internas se crean cada vez que se llama a la función externa.

Cuestiones relacionadas