Tengo un código muy simple (http://plnkr.co/edit/voHWdFfwu7TUreyjsRiU?p=preview):

function Fnc(){}
Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i);
        return i;
    };
    Fnc.prototype.fooz();
};


window.onload=function(){
    var fa = new Fnc();
    alert(fa.fooz()); // undefined!
    alert(fa.fooz()); // 2
    alert(fa.fooz() + fa.fooz()); // 7
};

Sale a la consola como se esperaba, 1,2,7. Pero lo que es inesperado es que la primera alerta genera 'indefinido'. ¿Por qué?


UPD Especialmente para, por ejemplo, GURU . Si establece menos, por favor, explique por qué. Gracias.


UPD 2. Simplemente no configuré el retorno en el primer Fnc.prototype.fooz (mientras se redifina). Sí, un error bastante ingenuo.

-2
srgg6701 4 mar. 2016 a las 16:04

3 respuestas

La mejor respuesta

Durante el primer alert(fa.fooz()); El Fnc.prototype.fooz no devuelve nada. Entonces, por defecto, una función devolverá undefined, no todo el tiempo, pero en nuestro caso devolverá undefined. Y más tarde, el Fnc.prototype.fooz se asignó con una nueva función y está devolviendo el valor i. Es por eso que está dando los resultados esperados.

Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i);
        return i;
    };
    Fnc.prototype.fooz();  // This is not retuning anything 
};

Si desea obtener el resultado deseado, simplemente cambie su código como se muestra a continuación,

Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i);
        return i;
    };
    return Fnc.prototype.fooz();  // add a return here. 
};

Experimentar con el lenguaje lo guiará a explorarlo. Pero no modifique un prototipo dentro de una misma función en sus proyectos en tiempo real, ya que causaría resultados no deseados.

1
Rajaprabhu Aravindasamy 4 mar. 2016 a las 13:21

Sale a la consola como se esperaba, 1,2,7. Pero lo que es inesperado es que la primera alerta salga 'indefinida'. ¡¿Pero por qué?!

Cuando redefinió Fnc.prototype.fooz dentro de Fnc.prototype.fooz, reemplazó la definición anterior de Fnc.prototype.fooz que no devolvía nada (significa devolver undefined).

Tenga en cuenta que incluso cuando lo redefinió, la ejecución de la función Fnc.prototype.fooz(); se realizó primero.

Por ejemplo, si agrego un console.log antes de la ejecución de la función

function Fnc(){}
Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i); //second print when executed first time
        return i;
    };
    console.log(Fnc.prototype.fooz); //this line will be printed first
    Fnc.prototype.fooz();
};

La próxima vez solo se imprimirá el archivo console.log dentro de la nueva definición (es decir, console.log('i: ', i);) porque se ha anulado la definición anterior.

1
gurvinder372 4 mar. 2016 a las 13:20

Su primera definición de Func.prototype.fooz primero se redefine a sí misma y luego regresa indefinido. Su redefinición devuelve algo.

En JavaScript sin retorno, la mayoría de las funciones devuelven indefinidas. La excepción son las funciones llamadas con new.

2
Nathanael Smith 4 mar. 2016 a las 13:14