0

グローバル変数から未定義になるのを避けるために、さまざまな方法を試しましたが、残りのコードが台無しになります。一部の関数を除くすべての関数で変数 this.userHunger を呼び出すことができます。私はどこかで間違っていたに違いないことを知っています:

<html>
<head>
<script>
function user() 
{
    this.userHunger = 100;
    this.userHealth = 100;
    this.userFoodNumber = 10;

    this.checkForHungerHealthData = function() 
    {
        document.getElementById('userHealthDisplay').innerHTML = "Your Health:" + this.userHealth;
        document.getElementById('HungerBarVisual').innerHTML = "Your Hunger" + this.userHunger;
        document.getElementById('amountOfFood').innerHTML = "Amount of food" + this.userFoodNumber;
    }

    this.signInButton = function()
    {
        document.getElementById('myButtonSignIn').style.visibility="hidden";
        this.checkForHungerHealthData(); // displays current hunger and health
    }

    this.eatFood = function() 
    {
        if(this.userFoodNumber  > 0) 
        {
            this.userHealth = this.userHealth + 10;
            this.userHunger = this.userHunger + 50;
            this.userFoodNumber--;
            document.getElementById('amountOfFood').innerHTML = "Amount of food:" + this.userFoodNumber;
            document.getElementById('userHealthDisplay').innerHTML = "Your Health:" + this.userHealth;
            document.getElementById('HungerBarVisual').innerHTML = "Your Hunger is currently " + this.userHunger + "%";
        }
    }

    this.start=function()
    {
        this.hungerClockStart();
    }

    this.hungerClockStart=function()
    {
        this.setUserHungerClock(setInterval(this.updateHungerScreen,1000));
    }

    this.updateHungerScreen=function()
    {
        alert(this.userHunger); //Returns undefined
        if(this.userHunger >= 0) 
        {
            var subtractAmount=1;
            document.getElementById('HungerBarVisual').innerHTML = "Hunger is Currently at: " + this.userHunger + "%";
            this.userHunger--;
        }
    }
}

var user1 = new user();

</script>
</head>
<h1 id = "userHealthDisplay">Your Health:<br></h1>
<h1 id = "HungerBarVisual">Your Hunger:<br></h1>

<input id="myButtonSignIn" style="visibility:visible" type="button" value="Sign in" onclick="user1.signInButton(); user1.hungerClockStart()">

<body>
<h1 id = 'Notifyer1'><br></h1>
<h1 id = 'Notifyer2'><br></h1>
<h1 id = 'amountOfFood'>Amount of Food:</h1>
<input id="eatFoodButton" style="visibility:visible" type="button" value="Eat some food!" onclick="user1.eatFood()">

</body>
</html>

this.hungerScreenUpdate 内でエラーが発生し続け、その理由がわかりません。

4

1 に答える 1

2
this.setUserHungerClock(setInterval(this.updateHungerScreen,1000));

する必要があります

this.setUserHungerClock(setInterval(this.updateHungerScreen.bind(this),1000));

JavaScript では、thisレキシカルではなく動的であるため、this呼び出し方に応じて変化する可能性があります。そうすると、正しい値でsetInterval(this.updateHungerScreen,1000)呼び出されません。関数を特定のコンテキストにバインドするために使用できます。updateHungerScreenthisbind


コメンターが示唆しているように、IE8以下で動作させる必要がある場合は、シムインするか、bindPhrogzのthis変数として保存する手法を使用する必要があります。


アップデート

thisJavaScript での動作の概要については、 https://stackoverflow.com/a/13373383/1662998を参照してください。

個人的にはbind、IE8 以下でシミングすることをお勧めします。そうすれば、古いブラウザとの下位互換性を維持しながら、先に進んで新しい機能を使用できます。これをページの上部にあるスクリプトに追加するだけで、準備完了です。

if (!Function.prototype.bind)
    Function.prototype.bind = function(context/*, ...preArgs */) {

        var f = this,
            preArgs = Array.prototype.slice.call(arguments, 1);

        if (typeof f != 'function')
            throw new TypeError('Function expected.');

        if (context != null)
            context = Object(context);

        return function bound(/* ...args */) {
            var args = Array.prototype.slice.call(arguments);
            return f.apply(context, preArgs.concat(args));
        };

    };
于 2012-11-24T17:56:02.817 に答える