布尔值在功能上没有变化 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
向数组添加一个条目,并且由于数组只是局部变量 hits
和 hits
在 two
对象中具有相同的引用,因此它们指向相同的内存位置,因此可以使用 returned 对象看到更新。
另一方面,hitLocation()
也修改了局部变量 isSunk
但因为你没有 return 并且它不是存储在变量 [=17= 中的对象的引用] 未更新。
解决这个问题的最佳方法是在此处使用 class 而不是对象。这将比 returning and/or 始终将您要执行某些操作的对象传递给函数更加简洁明了。
我有以下代码:
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
向数组添加一个条目,并且由于数组只是局部变量 hits
和 hits
在 two
对象中具有相同的引用,因此它们指向相同的内存位置,因此可以使用 returned 对象看到更新。
另一方面,hitLocation()
也修改了局部变量 isSunk
但因为你没有 return 并且它不是存储在变量 [=17= 中的对象的引用] 未更新。
解决这个问题的最佳方法是在此处使用 class 而不是对象。这将比 returning and/or 始终将您要执行某些操作的对象传递给函数更加简洁明了。