Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向函数添加条件,使其仅在特定情况下运行_Javascript - Fatal编程技术网

Javascript 向函数添加条件,使其仅在特定情况下运行

Javascript 向函数添加条件,使其仅在特定情况下运行,javascript,Javascript,我现在正在用javascript开发一个文本游戏,有一个拿起剑的功能 var takeSword = function() { if (currentRoom.hasSword) { $("<p>You picked up a sword.</p>").properDisplay(); } else { $("<p>The sword is not here.&l

我现在正在用javascript开发一个文本游戏,有一个拿起剑的功能

var takeSword = function() {
        if (currentRoom.hasSword) {
            $("<p>You picked up a sword.</p>").properDisplay();

        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    };
var=function(){
if(currentRoom.hasSword){
$(“你捡到一把剑。

”).properDisplay();
var takeSword = function() {
        if (currentRoom.hasSword) {
            $("<p>You picked up a sword.</p>").properDisplay();

        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    };
} 否则{ $(“剑不在这里。

”).properDisplay(); } };
我的问题是,只要你和剑在同一个房间,你就可以一遍又一遍地捡起它。您如何设置该功能,以便一旦拿起剑,就不能再拿起它

我最初的想法是设置一个变量,比如
var-swarm=false然后当函数运行时设置
swarm=true但这不起作用


这不是我的全部代码,还有一个对象设置'hasSword=true;'这样一来,剑就可以在第一时间捡到,而不能在游戏的不同房间里捡到。

也许是这样的吧

var GameState = {
    worldHasSword: true,
    playerHasSword: false,
    takeSword: function() {
        if( this.worldHasSword ) {
            this.worldHasSword = false;
            this.playerHasSword = true;
            $("<p>You picked up a sword.</p>").properDisplay();
        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    }
}

GameState.takeSword();
var游戏状态={
没错,
playerHasSword:错,
take剑:函数(){
如果(this.worldHasSword){
this.worldHasSword=false;
this.playerHasSword=true;
$(“你捡到一把剑。

”).properDisplay();
var takeSword = function() {
        if (currentRoom.hasSword) {
            $("<p>You picked up a sword.</p>").properDisplay();

        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    };
} 否则{ $(“剑不在这里。

”).properDisplay(); } } } 游戏状态;
@Kenney让我朝着正确的方向思考。下面是我在不完全重写函数的情况下修复它的方法:

var takeSword = function() {
        if (currentRoom.hasSword) {
            $("<p>You picked up a sword.</p>").properDisplay();
            currentRoom.hasSword = false;
        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    };
var=function(){
if(currentRoom.hasSword){
$(“你捡到一把剑。

”).properDisplay();
var takeSword = function() {
        if (currentRoom.hasSword) {
            $("<p>You picked up a sword.</p>").properDisplay();

        }
        else {
            $("<p>The sword is not here.</p>").properDisplay();
        }
    };
currentRoom.hasSword=false; } 否则{ $(“剑不在这里。

”).properDisplay(); } };

我犯的第一个错误是认为“hasSword”本身就是变量。我需要添加当前房间,然后它就可以正常工作了。我已经对它进行了测试,也在没有剑的房间里试用过,它似乎工作得很好。

这里最好的解决方案是根本不去碰你原来的函数,而是简单地将它封装在一个通用函数中,这样可以防止它被多次调用。此通用函数可用于代码中任何其他需要“一次通知”的地方:

function once(fn, context) { 
    var result;

    return function() { 
        if(fn) {
            result = fn.apply(context || this, arguments);
            fn = null;
        }

        return result;
    };
}
现在您只需执行以下操作:

var takeSwordOnce = once(takeSword);
并在代码中使用
takeSwordOnce
。或者,您可以执行以下操作:

takeSword = once(takeSword);

请参阅以进一步了解
once
功能的说明。

您可以在拾取
currentRoom
后,用拾取剑的状态标记
currentRoom.swordPicked=true
为什么不在拾取剑后将
hasSword
设置为
false
currentRoom.hasSword=false;player.hasSword=true?@JosephDreamer-不幸的是,这并没有改变任何事情。@Kenney-谢谢!我不是像你那样做的,但你给了我正确的方向。我将在下面公布答案。你可能还想知道玩家携带了多少剑!“也许还有其他事情要做?”肯尼同意。我想我必须使用某种类型的
for
循环或
forEach
来开始滚动不同的库存项目。因为我是从零开始学习这一点的,所以我选择了一条路径,让一件事情开始工作,在我理解了这一点之后,回头想想如何让它与多件事情一起工作。(也就是说,我现在可以选择一个项目,而不是选择两次。现在,我如何选择5个项目?)--这是下一步。是的,确实是一个非常好的方法!我让你继续干;-)这是一种开发的原型方法。请注意,您可能会达到这样一个程度:您必须重写整个代码板以适应某些新功能。这就是设计过程应该避免的(以及原型通常保持绝对最小的原因)。祝你好运。:-)它也被称为:“这种方法背后的基本思想是通过重复的周期(迭代)和一次更小的部分(增量)开发一个系统,允许软件开发人员利用在系统早期部分或版本的开发过程中所学到的知识。”