Javascript 如何解决;无法设置未定义的属性";关于JS?

Javascript 如何解决;无法设置未定义的属性";关于JS?,javascript,Javascript,我正在JS上建立一个“国际象棋游戏”,我必须做这样的东西。当我运行代码时,一切都正常,但在控制台上我得到消息“UncaughtTypeError:Cannotsetproperty'value'of undefined at func”。我该怎么解决这个问题?因为它会延迟页面 让obj={ 价值:50 } 函数func(对象){ 设置超时(func); object.value=10; } func(obj)计时器回调没有向func函数传递任何内容。因此,当func作为计时器的结果运行时,没有

我正在JS上建立一个“国际象棋游戏”,我必须做这样的东西。当我运行代码时,一切都正常,但在控制台上我得到消息“UncaughtTypeError:Cannotsetproperty'value'of undefined at func”。我该怎么解决这个问题?因为它会延迟页面

让obj={
价值:50
}
函数func(对象){
设置超时(func);
object.value=10;
}

func(obj)
计时器回调没有向
func
函数传递任何内容。因此,当
func
作为计时器的结果运行时,没有参数,因此
对象
未定义的

您需要将它包装在一个匿名函数中,该函数可以将
对象
传递给它。

让obj={
价值:50
}
函数func(对象){
setTimeout(function(){func(object);});
object.value=10;
}

func(obj)
setTimeout
接受两个参数:要调用的函数和以毫秒为单位的延迟

let obj = {
  value: 50
}

function func (object) {
  setTimeout(function() {
    func(object);
  }, 0); // how long should it wait?
  object.value = 10;
}

func(obj);
setTimeout(func)
调用您的
func
,而不传递
对象
。只需移除它(它甚至有害,如下所述):

让obj={
价值:50
}
函数func(对象){
object.value=10;
}
func(obj);

控制台日志(对象值)
从技术上讲,您甚至不需要将
obj
传递给
func()
;由于
obj
是在函数外部定义的,因此作用域指示它无需传递即可使用

让obj={
价值:50
}
函数func(){
设置超时(func);
obj.value=10;
}

func()参数是反向的。@connexo当然是。计时器是自参考的。这与使用间隔基本相同。但是,这不是文章的重点。鉴于OP的熟练程度,这是一个重要的观点。@connexo我不同意。我想这就是这篇文章的全部内容——找出回调失败的原因。这是一个无限异步循环,浏览器可以处理:)我想OP在遇到他现在遇到的问题之前甚至还没有写退出语句。
setTimeout(func)
调用您的
func
,而不传递
对象。您试图实现什么<代码>设置超时
需要一个持续时间。另外,您没有将对象传递给它。一旦你得到这个工作的功能将永远保持调用自己。。。这就是你想要的吗?你能解释一下你的意图吗?如果你的计划是使用闭包,它必须是
setTimeout
谓词中的
func(object)
setTimeout
不需要两个参数。如果需要,可以省略延迟。延迟以毫秒为单位。而且它只是一个最小的,不是一个保证的,精确的延迟。它本质上并不有害,因为这是制作动画的常用方法。这基本上是一个间歇。但是,这种技术比使用间隔更有效。我不能考虑任何创建无限循环的代码来解决任何问题。这是非常非常糟糕的编码。不,不是。这就是持续运动的动画效果。这是非常普遍的。我们这里讨论的是异步回调。它的功能与
setInterval
@connexo完全相同,我理解您的担忧,但是
while(true)
非常好。在发电机中,这甚至是一种常见的模式。我们不知道我们是否在查看已完成的代码。@ScottMarcus它不完全相同,因为它无法
stopInterval
。我认为问题的关键是,为什么编写的代码失败了,并没有真正找到另一种方法来编写此代码。公平,但其他答案(即您的答案)我已经用匿名函数指出了
setTimeout()
上的逻辑错误,所以如果我发布了,它将毫无意义。发布另一种方法没有害处。