我试图在具有String.prototype.slice()的函数中传递两个参数,但是控制台不断返回此错误:


  未捕获的TypeError:无法读取未定义的属性“切片”。


争论不应该被通过吗?



const testText = '<p style='color: red;'>This is a test</p>'
const testParagraph = document.getElementById('test')

const message = (paragraph, originText) => {
  let i = 0,
    text, isTag
  const speed = 50
  text = originText.slice(0, ++i)
  if (text === originText) return
  paragraph.innerHTML = text
  const char = text.slice(-1)
  if (char === '<') isTag = true
  if (char === '>') isTag = false
  if (isTag) return message()
  setTimeout(message, speed)
}

message(testParagraph, testText)

<div id="test"></div>

最佳答案

在两个地方可能会递归调用message函数:

if (isTag) return message()
setTimeout(message, speed)


在这两种情况下,message函数均不带参数调用。由于此paragraph,因此originText参数与undefined值相关联。然后,它尝试在.slice上调用undefined,这会引发错误。

您需要将参数传递给递归调用,因为它(像常规函数调用一样)使用一个词法环境创建了一个新的执行上下文。

if (isTag) return message(arg1, arg2)
setTimeout(message.bind(null, arg1, arg2), speed)

10-04 21:25
查看更多