函数总是返回相同的值

时间:2021-03-17 20:24:58

标签: javascript

我目前正在开发一款能让用户将棋子放置在网格上的游戏。一旦一块被放置在网格上,应该有一些功能可以防止在相同的网格位置添加更多的块。以下是我迄今为止为此功能设计的内容。

我遇到的问题是该函数总是返回 false,从而使棋子能够不断添加到相同的网格位置,即使放置了一艘船。 startend 都是整数值,direction 是水平或垂直:

    const checkIfShipPresent = (direction, start, end) => {
        if (direction === 'horizontal') {
            for (let i = start; i <= end; i++) {
                shipYard.forEach((ship => {
                    if (ship.position.includes(i)) {
                        return true;
                    }
                }))
            };
            return false;

下面的代码说明了我是如何尝试测试该函数的:

    const checkIfShipPresent = (direction, start, end) => {
        if (direction === 'horizontal') {
            for (let i = start; i <= end; i++) {
                shipYard.forEach((ship => {
                    console.log(ship.position)
                    console.log(i)
                    console.log(ship.position.includes(i))
                    if (ship.position.includes(i)) {
                        console.log("triggered")
                        return true;
                    }
                }))
            };
            console.log("firing")
            return false;

这是相关的控制台日志结果(一艘船放置在网格位置 [0,1,2,3,4] 并点击单元格 0):

gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 0
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 1
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 2
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 3
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 4
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:80 firing

如果有船存在,我需要该函数返回 true,但正如您所见,它永远不会跳出循环,因此将始终返回 false。

1 个答案:

答案 0 :(得分:3)

再次仔细查看代码的这一部分 - 特别是 return true;

for (let i = start; i <= end; i++) {
    shipYard.forEach((ship => {
        if (ship.position.includes(i)) {
            return true;
        }
    }))
};
return false;

return 从 - 并退出 - 它在里面的函数。这是传递给 forEach 方法的匿名箭头函数。请注意,forEach 实际上会忽略传递给它的回调的任何返回值 - 它只对传递给它的函数的任何副作用有用。

如果您希望在 true 条件成立时从更广泛的函数中返回 if,您应该使用标准的 for 循环而不是 forEach。这不涉及任何函数,因此 return 将按您的需要执行:

for (let i = start; i <= end; i++) {
    for (const ship of shipYard) {
        if (ship.position.includes(i)) {
            return true;
        }
    }))
};
return false;

(我使用了更简洁的 for ... of 循环形式,但常规的 for (let j = 0; j < shipYard.length; j++) 样式循环也可以正常工作。)