开发者问题收集

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

2019-10-18
969

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

let obj = {
  value: 50
}

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

func(obj);

一切正常,但控制台说出了问题。我该怎么办?

3个回答

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

您需要将其包装在一个可以将 object 传递给它的匿名函数中。

let obj = {
	value: 50
}

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

func(obj);
Scott Marcus
2019-10-18

从技术上讲,您甚至不需要将 obj 传递给 func() ;因为 obj 是在函数外部定义的,所以范围决定它无需传递即可使用。

let obj = {
  value: 50
}

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

func();

注意: func() 内的 setTimeout(func) 会导致无限循环(如答案/评论中指出的那样),但至于为什么您会收到错误,这是一种解决问题的方法。

Tim Lewis
2019-10-18

setTimeout 有 2 个参数:要调用的函数和以毫秒为单位的延迟。

let obj = {
  value: 50
}

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

func(obj);
Ibu
2019-10-18