布尔值在功能上没有变化 JavaScript

boolean does not change in function JavaScript

我有以下代码:

const ships = (length) => {
  isSunk = false
  console.log('BEFORE: ' + isSunk)
  const shipSize = length
  let hits = []
  const hitLocation = location => {
    hits.push(location);
    isSunk = true;
    console.log('INSIDE: ' + isSunk)
  }
  console.log('AFTER: ' + isSunk)
  return {
    isSunk,
    hitLocation,
    hits,
    shipSize
  }
}

const two = ships(2)
two.hitLocation(1)
two.hitLocation(2)
console.log('FINAL: ' + two.isSunk)
console.log('HITS: ' + two.hits)

请问为什么最后调用时isSunk没有保存为true

是函数嵌套的问题吗?

当您将布尔值设置到对象中时,它就是那个值。它不是对变量的引用。因此,当您更改变量时,保存在返回对象中的值不会更新。

您可以使用函数获取值

const ships = (length) => {
  isSunk = false
  console.log('BEFORE: ' + isSunk)
  const shipSize = length
  let hits = []
  const hitLocation = location => {
    hits.push(location);
    isSunk = true;
    console.log('INSIDE: ' + isSunk)
  }
  console.log('AFTER: ' + isSunk)
  return {
    isSunk: () => isSunk,
    hitLocation,
    hits,
    shipSize
  }
}

const two = ships(2)
two.hitLocation(1)
two.hitLocation(2)
console.log('FINAL: ' + two.isSunk())

其他选项是使用 class。

class Ship {

    hits = [];
    
    constructor(length) {
        this.shipSize = length;
    }
    
    get isSunk() {
        return this.hits.length === this.shipSize;
    }
    
    hitLocation (location) {
      this.hits.push(location);
      console.log('INSIDE: ' + this.isSunk)
    }
    
}


const two = new Ship(2)
two.hitLocation(1)
two.hitLocation(2)
console.log('FINAL: ' + two.isSunk)

发生这种情况的原因是 isSunk 只是一个局部变量和一个值 hits 相比,后者也是一个局部变量但是数组,因此只是一个 引用而不是一个值 。 当您 return 调用对象时 ship() 这些值和引用在对象中得到 returned。

现在,当您调用 hitLocation() 时,它使用局部变量 hits 向数组添加一个条目,并且由于数组只是局部变量 hitshitstwo 对象中具有相同的引用,因此它们指向相同的内存位置,因此可以使用 returned 对象看到更新。

另一方面,hitLocation() 也修改了局部变量 isSunk 但因为你没有 return 并且它不是存储在变量 [=17= 中的对象的引用] 未更新。

解决这个问题的最佳方法是在此处使用 class 而不是对象。这将比 returning and/or 始终将您要执行某些操作的对象传递给函数更加简洁明了。