如何解决JS上的“无法设置未定义的属性”?

时间:2019-10-18 17:55:01

标签: javascript

我正在JS上构建“棋牌游戏”,我必须做类似的事情。运行代码时,一切正常,但是在控制台上,我收到消息“未捕获的TypeError:无法在func上设置未定义的属性'value'”。我该怎么做才能解决这个问题?因为它延迟了页面。

let obj = {
  value: 50
}

function func (object) {
  setTimeout(func);
  object.value = 10;
}

func(obj);

一切正常,但控制台显示有问题。我该怎么办?

4 个答案:

答案 0 :(得分:2)

您的计时器回调未将任何内容传递给func函数。因此,当func作为计时器的结果运行时,没有参数,因此objectundefined

您需要将其包装在可以传递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

按照目前的状态,使用它不会产生任何值,但会创建无限循环。