Considere esto:

function f2(x) {
    return x+1;
};

X = function(){
    this.f1=function (x) {
      return 2*f2(x);
    }

    return this;
};

Entonces x = new X(); x.f1(1) funciona bien.

Pero cuando quiero hacer esto:

X = function(){
    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {
        return 2*f2(x);
    }

    return this;
};

La misma declaración se quejará de que no puede encontrar f2. En, por ejemplo, c #, puede decir

class X {
   int f2(int x){return x+1;}
   int f1(int x){return 2*f2(x);}
}

Y esto funcionará

X x=new X();
x.f1(1)

¿por qué?

0
Andr 26 sep. 2011 a las 00:57

5 respuestas

La mejor respuesta

Para hacer referencia a f2 en su segundo bloque de código, deberá usar this.f2. this hace referencia al contexto en el que se ejecuta la función. Como llamas a f1 de la siguiente manera:

x.f1();

... context se establece en la instancia, x.

JavaScript no hace que las variables de instancia estén disponibles para el alcance de la misma manera que las variables de alcance, es decir, aquellas directamente disponibles:

X = function(){

    var f2 = 123;

    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {

        console.log(f2); // => 123
        console.log(this.f2); // => function(){}

        return 2 * this.f2(x);
    };

    return this;
};
0
James 25 sep. 2011 a las 21:05
X = function(){
       this.f2 = function(x) {
            return x+1;
       };    
       this.f1=function (x) {
            return 2*this.f2(x);  // <-- Need this here since it is not implicit
       }
       return this;
    };
0
epascarello 25 sep. 2011 a las 21:03

Porque olvidaste esto .f2. Javascript no ve las variables de clase sin esto

1
Kara 11 feb. 2014 a las 22:24

Debe hacer referencia a f2 con la palabra clave this explícitamente.

X = function(){
    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {
        return 2*this.f2(x);
    }

    return this;
};
1
Gazler 25 sep. 2011 a las 21:01

Javascript no tiene el this implícito que obtienes en C #. Necesita agregar esto en:

X = function(){
    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {
        return 2*this.f2(x);
    };

    return this;
};
0
skabbes 25 sep. 2011 a las 21:02