Differenza tra scope lessicale e variabili passanti in JS

0

Esistono diversi modi per raggiungere lo stesso endpoint in JS, ad esempio:

(function (foo, bar) {
  return {run: function () {return foo(bar);}};
} (foo, bar));

(function (foo, bar) {
  return (function(foo, bar) { return {run: function () { return foo(bar); }}} (foo, bar))
} (foo, bar))

(function (foo, bar) {
  var Fizz = function (foo, bar)  { this.run = function () { return foo(bar); }; };
  return new Fizz(foo, bar) 
} (foo, bar))

Ora per questi, so che una differenza è che il prototipo nel terzo caso per l'oggetto restituito sarebbe diverso, ma a parte questo, tutti e tre i percorsi portano a un oggetto che fornisce la stessa API. E dal momento che Javascript è un linguaggio dattiloscritto, la cosa è solitamente definita dal suo comportamento.

Ci sono altre implicazioni nello scegliere un approccio dei tre che sto ignorando?

    
posta kapv89 25.05.2014 - 22:26
fonte

1 risposta

1

L'unica differenza tra i primi due è la profondità dello stack (anche se non è assolutamente impossibile ottimizzarlo), poiché l'unica differenza è la quantità di ambiti che stai creando. Si noti che è possibile continuare a creare tutti gli ambiti desiderati:

(function (foo, bar) {
        return (function(foo, bar) {
                return (function(foo, bar) {
                        return (function(foo, bar) {
                                return (function(foo, bar) {
                                        return (function(foo, bar) {
                                                return {run: function () { return foo(bar); }}
                                        } (foo, bar))
                                } (foo, bar))
                        } (foo, bar))
                } (foo, bar))
        } (foo, bar))
} (foo, bar))

Dietro le quinte, una funzione JavaScript mantiene un puntatore al suo ambito lessicale, quindi più ambiti creerai più in profondità dovrai risalire nell'ambito della funzione che hai inserito nel campo run del oggetto. Anche in questo caso, questo potrebbe essere ottimizzato e non ha alcun effetto sulla logica poiché gli oggetti della funzione JavaScript non forniscono un modo per accedere a tale ambito (sebbene un'implementazione JavaScript possa aggiungere un campo di questo tipo)

    
risposta data 26.05.2014 - 01:14
fonte

Leggi altre domande sui tag