Sì, capisco il punto di vista su entrambe le questioni...tornando al problema iniziale, ho una curiosità: cosa ti da fastidio nell'usare una sintassi più jquery-like on obj.literal e cicli?Originariamente inviato da carlomarx
Eh, lo so... ma le closures cerco di evitarle come la peste... non è un caso che avevo scelto di creare le nuove funzioni tramite il costruttore di funzioni: le funzioni così create infatti non creano mai una closure col proprio contesto (se infatti provassi ad accedere a variabili locali dalle funzioni così create ti verrebbe restituito un errore).
Semplicemente mi sembra folle che vogliano eliminare arguments.callee.
Un'alternativa al costruttore di funzioni che non crei closures in questo caso potrebbe essere Function.bind(). Ma ciò non toglie il fatto che eliminare arguments.callee significherebbe privare le funzioni costruite tramite new Function della possibilità di riconoscere sé stesse. Mah.
Per il consumo della memoria nell'istanziare i literal non credo ci siano grossi problemi, per il genere di lavoro a cui punti la loro dimensione è relativamente piccola. Inoltre spesso c'è la necessità di utilizzare oggetti già pronti (ad esempio se ti vengono spediti dal server in notazione JSON, ma immagino ci siano moltri altri casi).
In tal caso dovrei ciclare io sviluppatore sul mio oggetto per effettuare n chiamate alla function.
Questo vorrebbe anche dire creare ogni volta l'ambiente locale e fare degli accessi in memoria n volte (ed esempio, con il ciclo accedo una volta a nodi.length, nella tua implementazione ci accedo n volte).
Per quanto riguarda le "tempistiche" ho preparato un test su
jsperf giusto per dare un'occhiata generica (scusa se ci sono errori, ho fatto un pò al volo). Nel mio caso ho usato un while che dovrebbe dare un minimo di vantaggio, il tuo codice non l'ho toccato invece.
Pare che le due soluzioni siano paragonabili. Quella tipo jQuery è più veloce su IE però, un dettaglio interessante.
Inoltre l'espressività della seconda soluzione mi pare migliore (ma questo è solo un parere personale).
Sarebbe interessante, poi, controllare come i vari interpreti gestiscono lo stack delle chiamate per saperne di più.
Ciò non toglie che il tuo codice abbia un certo stile e appeal, mi piace molto l'idea di ritornare la function ad ogni passo di calcolo.
Fammi sapere cosa ne pensi.
![]()