Javascript 全局变量正在重置

标签 javascript function scope global-variables var

我想做的事情的总结:我制作了一个非常简单的游戏,它使用 do/while 函数和开关来检查你在哪个房间。如果你在房间 = 1,开关选择room1 并运行 room1() 函数。在房间内,你可以选择去哪个方向。如果你选择北或东,将运行 door1() 或 door4() 函数,说“你想打开这扇门吗? "你可以说“打开”然后走进下一个房间,你的房间 = 1 将更新为一个新值。

什么是坏的:这一切都工作得很好,功能(虽然它们有些臃肿)似乎在正常工作。一个主要问题是,每当我穿过一扇门时,我的变量都会重置,所以我总是在房间 1,我的指南针总是等于 0,并且没有任何门或房间等于“已访问”(例如:room1V = 0)。

基本上,我穿过一扇门,然后又回到了房间 1,而不是房间 2 或 4。

这是代码和演练:

    var room1V = 0; //room1  // these variables tell the computer whether I have 'visited' a room before.
    var room2V = 0; //room2
    var room3V = 0; //room3
    var room4V = 0; //room4

    var door1V = 0; //room1 - room2 // these variables tell the computer whether I have used a door before.
    var door2V = 0; //room2 - room3
    var door3V = 0; //room3 - room4
    var door4V = 0; //room4 - room1

    var compass = 0; // which side of the room am I on?
    var room = 1; // what room am I currently in?
    var reply = 1; // this is re-declared as a local variable in each function, and it works fine
    win = 0; // this will eventually tell the room-check do/while to stop

    // This do/while checks what room I am in:
    do {
        quit = 0;
        switch(room) {
            case '1':
                room1(compass,room1V);
                break;
            case '2':
                room2(compass,room2V);
                break;
            case '3':
                room3(compass,room3V);
                break;
            case '4':
                room4(compass,room4V);
                break;
        }
    } while (win != 1);

由于默认表示 room = 1,room1(compass,room1V) 函数将启动。

    function room1(compass,room1V) {
        if (room1V === 1) {
            console.log("You are in room 1 again.");
            document.write("You are in room 1 again." + "<br>");
            var reply = prompt("Where would you like to go? EAST, NORTH?");
            switch(reply.toLowerCase()) {
                case 'east':
                    compass = "east"; //because you are trying to open the east door, you will now see room1 from the east. If you make it through, your compass will update to 'west' because you will be on the west side of room2.
                    door1(compass,door1V);
                    break;
                case 'north':
                    compass = "north";
                    door4(compass,door4V);
                    break;
                default:
                    console.log("Something went wrong.");
                    document.write("Something went wrong." + "<br>");
            }
        } else {
            console.log("You are in room 1.");
            document.write("You are in room 1." + "<br>");
            room1V = 1;
            reply = prompt("Where would you like to go? EAST, NORTH?");
            switch(reply.toLowerCase()) {
                case 'east':
                    compass = "east";
                    door1(compass,door1V);
                    break;
                case 'north':
                    compass = "north";
                    door4(compass,door4V);
                    break;
                default:
                    console.log("Something went wrong.");
                    document.write("Something went wrong." + "<br>");
            }
        }
    }   // Working

如果我往“北”走,指南针会更新以说明我从哪个方向看房间,door4(room,door4V) 会运行。

    function door4(room,door4V) {
        if (door1V === 1) {
            console.log("You approach door 4 again.");
            document.write("You approach door 4 again." + "<br>");
            var reply = prompt("What would you like to do? OPEN, QUIT?");
            switch(reply.toLowerCase()) {
                case 'open':
                    if (room === 4) {
                       room = 1;
                       compass = "north";
                       console.log("You walk through door 4 into room 1...");
                       document.write("You walk through door 4 into room 1..." + "<br>");
                    } else {
                       room = 4;
                       compass = "south";
                       console.log("You walk through door 4 into room 4...");
                       document.write("You walk through door 4 into room 4..." + "<br>");
                       }
                    quit = 1;
                    break;
                case 'quit':
                    quit = 1;
                    break;
                default:
                    console.log("Something went wrong.");
                    document.write("Something went wrong." + "<br>");
            }
        } else {
            console.log("You approach door 4.");
            document.write("You approach door 4." + "<br>");
            var reply = prompt("What would you like to do? OPEN, QUIT?");
            switch(reply.toLowerCase()) {
                case 'open':
                    if (room === 4) {
                       room = 1;
                       compass = "north";
                       console.log("You walk through door 4 into room 1...");
                       document.write("You walk through door 4 into room 1..." + "<br>");
                    } else {
                       room = 4;
                       compass = "south";
                       console.log("You walk through door 4 into room 4...");
                       document.write("You walk through door 4 into room 4..." + "<br>");
                    }
                    quit = 1;
                    break;
                case 'quit':
                    quit = 1;
                    break;
                default:
                      console.log("Something went wrong.");
                      document.write("Something went wrong." + "<br>");
            }
        }
    }       // Working

此时,do/while 函数应该说:“哦!因为房间 = 4,所以你现在在房间 4。”但事实并非如此。 Room does = 4,但是当 do/while 重新运行时,我回到了 room1,并且所有变量似乎都已重置。

最佳答案

您的变量“重置”的原因是因为 JavaScript 中的原语是按值传递的。在您的 do-while 循环中,您将变量 room1V .. room4V 传递给函数 room1 .. room4。变量是 JavaScript 中的原语,按值传递。这意味着在被调用函数中对它们所做的任何更改都不会反射(reflect)在原始参数中。当您使用 compassdoor4v 调用 door4 函数时也是如此:这些变量按值传递。为了更好地理解这一点,请尝试阅读 this chapter .

关于Javascript 全局变量正在重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549525/

相关文章:

javascript - 奇怪的匿名javascript函数调用

javascript - 使用 .click() 模拟文件输入点击在 iOS 中不起作用 - Cordova

c - 关于类型,c 中的 `int (*)(int)` 是什么意思?

java - 删除数组数据的代码不起作用

javascript - Jasmine 类型错误: Cannot call method 'expect' of null

C++ 简单链表超出范围的变量

javascript - 下划线 map 对象

javascript - 如何在打开新页面后将焦点设置在弹出窗口上?

javascript - 在 Mathjs 中定义中缀运算符

c# - C# 中的作用域变量?