Estoy aprendiendo JS y me pregunto, ¿hay alguna manera de devolver la función bar () o buz () sin devolver foo ()? Por ejemplo, si quisiera devolver la barra de funciones (); para obtener 2, ¿podría hacer eso? ¿Sería algo así como foo (). Bar (); ?

// Nested Scopes
function foo() {  // can only access itself
  var a = 1;

  function bar() {  // access to foo(), not buz()
    var b = 2;

    function buz() {   // access to bar() and foo()
      var c = 3;

      console.log(a, b, c);  // 1, 2, 3
    }
    buz();
    console.log(a, b);  // 1, 2
  }
  bar();
  console.log(a);  // 1
}
foo();  // 1
0
andy sims 17 feb. 2017 a las 07:12

3 respuestas

La mejor respuesta

Puedes hacer esto, pero es bastante complicado.

La sintaxis básica es:

foo().bar().buz();

Dondequiera que agregue otro () después de uno existente, imprimirá ese nivel. Vea el fragmento para ejemplos.

// Nested Scopes
function foo() { // can only access itself
  var a = 1;

  function bar() { // access to foo(), not buz()
    var b = 2;

    function buz() { // access to bar() and foo()
      var c = 3;

      return (function() {
        console.log(a, b, c);
      });
    }

    return (function() {
      var tmp = function() {
        console.log(a, b);
        return {
          buz: buz
        };
      };
      tmp.buz = buz;
      return tmp;
    })();
  }

  return (function() {
    var tmp = function() {
      console.log(a);
      return {
        bar: bar
      };
    };
    tmp.bar = bar;
    return tmp;
  })();
}


foo().bar().buz(); // (nothing)
foo().bar()().buz(); // 1, 2
foo()().bar()().buz(); // 1  // 1, 2
foo()().bar().buz()(); // 1  // 1, 2, 3
foo()().bar()().buz()(); // 1  // 1, 2  // 1, 2, 3

Este tipo de abuso abusa del hecho de que puede asignar propiedades a cualquier cosa en JavaScript, incluidas las funciones.

  • foo es una función que se refiere al foo externo.
  • foo() es otra función que se refiere a esa tmp interna que tiene una propiedad bar que se refiere a la función interna bar.
  • foo()() en realidad llama a esa función interna tmp pero todavía te deja con un objeto que tiene una propiedad bar que nuevamente se refiere a la función interna bar.

Este enfoque es básicamente el mismo para bar.

Sin embargo, para buz, (something).buz() es solo una función, sin propiedades adicionales y (something).buz()() no devuelve nada, porque ese es el nivel final.

0
user4642212 17 feb. 2017 a las 04:54

Ciertamente. Puede devolver un objeto en cada etapa que contiene la función, o puede devolver la función en sí. Esto utiliza lo que se llama un cierre.

function foo() {
  var a = 1;
  
  function bar() {
    var b = 2;
    
    function buz() {
      var c = 3;
      console.log(a, b, c);
    }
    
    console.log(a, b);
    return { buz: buz };
  }
  
  console.log(a);
  return { bar: bar };
}

foo().bar().buz();
1
4castle 17 feb. 2017 a las 04:26

Haces esto más como establecer una variable.

var foo = {

bar: function() { return 3; } }

console.log(foo.bar());

0
Chacliff 17 feb. 2017 a las 04:25