为什么未定义javascript参数?

时间:2018-09-18 14:32:57

标签: javascript

我收到未定义“ txtname”的错误。

    let i = 0;
let txtOne = 'Hi';
let txtTwo = 'My name is Sarah';
let txtThree = "and I'm learning web development";
let speed = 200; 
let firstdiv = document.querySelector(".firstOne");
let nextdiv = document.querySelector(".nextOne");
let lastdiv = document.querySelector(".lastOne");

function typeWriter(txtname, divname) {
    if (i < txtname.length) {
divname.innerHTML += txtname.charAt(i);
       i++;
        setTimeout(typeWriter, speed);
    }
}

window.onload = typeWriter(txtOne, firstdiv);
firstdiv.addEventListener("animationend", typeWriter(txtTwo, nextdiv));
nextdiv.addEventListener("animationend", typeWriter(txtThree, lastdiv));

为什么txtname出现为undefined?它不应该被我在typeWriter函数中作为参数传递的内容所取代吗? 为什么typeWriter函数不查看txtOne.length或txtTwo.length等?

我仍在学习javascript,因此,如果这是一个基本错误,请原谅。

1 个答案:

答案 0 :(得分:4)

setTimeout(typeWriter, speed)表示在200毫秒内将不带任何参数调用typeWriter。上一个调用的参数不会自动结转到下一个调用,您需要提供它们。您可以使用匿名函数来做到这一点:

setTimeout(function () { typeWriter(txtname, divname) }, speed)

在解决此问题时,可能还应该将i之类的状态移入函数中,而不要依赖于全局状态。您可以通过接受i作为参数,但将其默认值设为0

function typeWriter(txtname, divname, i) {
    i || (i = 0);

    if (i < txtname.length) {
        divname.innerHTML += txtname.charAt(i);
        setTimeout(function () { typeWriter(txtname, divname, i + 1) }, speed);
    }
}

这是带有递归函数的常见模式。

另一个问题是您设置事件处理程序的方式。您实际上是将typeWriter函数的返回值设置为事件处理程序,而不是函数本身。您应该删除调用运算符,即window.onload = typeWriter,但是由于要使用特定参数调用该函数,因此需要将代码包装到另一个函数中:

window.onload = function() { typeWriter(txtOne, firstdiv) };
firstdiv.addEventListener("animationend", function() { typeWriter(txtTwo, nextdiv) });
nextdiv.addEventListener("animationend", function() { typeWriter(txtThree, lastdiv) });