访问整个字符串而不是字符串的一部分

时间:2018-02-07 19:40:43

标签: javascript jquery html

我尝试编写一个JavaScript jQuery程序,说一个数字。它代表我之前记录的一些记录。我有一个问题。当我键入数字时,它只播放最后一条记录(字符串的最后一个字符)。这是该计划:

function recognizer (num) {            
        var result = '#';
            switch(num) {
            case '0':
                result += 'zero';
                break;
            case '1':
                result += 'one';
                break;
            case '2':
                result += 'two';
                break;
            case '3':
                result += 'three';
                break;
            case '4':
                result += 'four';
                break;
            case '5':
                result += 'five';
                break;
            case '6':
                result += 'six';
                break;
            case '7':
                result += 'seven';
                break;
            case '8':
                result += 'eight';
                break;
            case '9':
                result += 'nine';
                break;
        }

        return result;
    }     

$('#submit').click(function() {

    var num = $('#number').val();

    var delay = 1000;

    for (var i = 0; i < num.length; i++) {
        var indexNum = recognizer(num[i]);
        setTimeout(function () {
            $(indexNum).trigger('play');
        }, delay);
        delay += 1000;
    }

});

2 个答案:

答案 0 :(得分:2)

真正的问题是你有一个闭包,当执行该函数时,indexNum的值已被设置为最终数字。您可以使用let打破闭包,或使用Standard-Closure-Breaking-Pattern。

setTimeout((function (indexNum) {
     return function() { $(indexNum).trigger('play'); };
})(indexNum), delay);

此外,您的recognizer可能会被压缩。假设num始终是一个单一的字符串,它出现的意思是给你的例子。

function recognizer(num) {
   const numberWords = ['zero', 'one', 'two', ...];
   return `#${numberWords[num]}`;
}

答案 1 :(得分:0)

异步功能可能会造成一些麻烦...

尝试为每个循环创建一个新的vars实例:

unsigned int

&#13;
&#13;
    var indexNum = recognizer(num[i]);

    (function (indexNum, delay) {
        setTimeout(function () {
            $(indexNum).trigger('play');
        }, delay);
    })(indexNum, delay);
&#13;
&#13;
&#13;