Javascript JS原型&x2500;为什么';未定义';?

Javascript JS原型&x2500;为什么';未定义';?,javascript,runtime,prototype,Javascript,Runtime,Prototype,我有一个非常简单的代码(): 它按预期输出到控制台1、2、7。但是,第一个警报输出“未定义”,这是出乎意料的。 为什么? UPD 特别是对于i.e.古鲁。如果你设置负数,请解释原因。多谢各位 UPD2。我只是没有在第一个Fnc.prototype.fooz中设置return(在重新定义时)。是的,相当幼稚的错误 在第一次警报期间(fa.fooz())Fnc.prototype.fooz没有返回任何内容。因此,默认情况下,函数将返回未定义的,但并非总是如此,但在我们的例子中,它将返回未定义的。

我有一个非常简单的代码():

它按预期输出到控制台1、2、7。但是,第一个警报输出“未定义”,这是出乎意料的。 为什么?


UPD 特别是对于i.e.古鲁。如果你设置负数,请解释原因。多谢各位



UPD2。我只是没有在第一个Fnc.prototype.fooz中设置return(在重新定义时)。是的,相当幼稚的错误

在第一次
警报期间(fa.fooz())
Fnc.prototype.fooz没有返回任何内容。因此,默认情况下,函数将返回
未定义的
,但并非总是如此,但在我们的例子中,它将返回
未定义的
。后来,
Fnc.prototype.fooz
被分配了新函数,它返回
i
值。这就是为什么它能带来预期的结果

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 
};
如果你想得到你想要的结果,只需修改你的代码如下

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. 
};

语言实验将引导你去探索它。但不要在实时项目中修改同一函数内的原型,因为这会导致不希望的结果。

您对Func.prototype.fooz的第一个定义首先重新定义自身,然后返回未定义。你的重新定义返回了一些东西

在没有返回的JavaScript中,大多数函数返回未定义的。使用new调用的函数除外

它按预期输出到控制台1、2、7。但出乎意料的是, 第一个警报输出“未定义”。但为什么

当您在
Fnc.prototype.fooz
内部重新定义
Fnc.prototype.fooz
时,它替换了先前的
Fnc.prototype.fooz
定义,该定义没有返回任何内容(表示返回
未定义的

请注意,即使重新定义它,函数执行
Fnc.prototype.fooz()先完成

例如,如果在函数执行之前添加
console.log

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();
};
下次以后,只打印新定义中的console.log(即
console.log('i:',i);
),因为先前的定义已被覆盖

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();
};