我正在JS上构建“棋牌游戏”,我必须做类似的事情。运行代码时,一切正常,但是在控制台上,我收到消息“未捕获的TypeError:无法在func上设置未定义的属性'value'”。我该怎么做才能解决这个问题?因为它延迟了页面。
let obj = {
value: 50
}
function func (object) {
setTimeout(func);
object.value = 10;
}
func(obj);
一切正常,但控制台显示有问题。我该怎么办?
答案 0 :(得分:2)
您的计时器回调未将任何内容传递给func
函数。因此,当func
作为计时器的结果运行时,没有参数,因此object
是undefined
。
您需要将其包装在可以传递object
的匿名函数中。
let obj = {
value: 50
}
function func (object) {
setTimeout(function() { func(object); });
object.value = 10;
}
func(obj);
答案 1 :(得分:1)
从技术上讲,您甚至不需要将obj
传递给func()
;由于obj
是在函数外部定义的,作用域表明该函数无需传递就可以使用。
let obj = {
value: 50
}
function func () {
setTimeout(func);
obj.value = 10;
}
func();
请注意:setTimeout(func)
中的func()
会导致无限循环(如答案/评论中所指出),但是就为什么出现错误而言,这是解决此问题的一种方法
答案 2 :(得分:0)
setTimeout
包含2个参数:调用函数和延迟(以毫秒为单位)。
let obj = {
value: 50
}
function func (object) {
setTimeout(function() {
func(object);
}, 0); // how long should it wait?
object.value = 10;
}
func(obj);
答案 3 :(得分:0)
:_id
会在不传递(defclass mr ()
( (_id :accessor _id
:initarg :_id)
(value :accessor value
:initarg :value)))
的情况下呼叫您的setTimeout(func);
。只需将其删除(如下所述,它甚至有害):
func
按照目前的状态,使用它不会产生任何值,但会创建无限循环。