不同函数

时间:2015-06-04 05:33:18

标签: javascript arrays scope

我有两个在两个独立函数中命名相同的数组。我假设数组对于每个函数都是局部的,但是第一个函数中的一些值会弄乱另一个函数中的值。当我在第二个函数中更改数组的名称时,它可以工作。如果你问我,似乎违背了范围。为什么我的第一个解决方案不起作用?

问题具有函数LetterCountI(str)接受传递的str参数并返回具有最大重复字母数的第一个单词。例如:"今天,是有史以来最伟大的一天!"应该返回最大的,因为它有2个(和2个&t; s),并且它在之前有2个e e's。如果没有重复字母的单词返回-1。单词将以空格分隔。

非工作解决方案:

function repeatCount(word) {
    tmp = [];
    for (var i = 0;i<word.length;i++) {
        tmp.push(word.filter(function(value) {return value === word[i]}).length)
    }
    return Math.max.apply(Math,tmp);
}

function LetterCountI(str) {
    tmp = [];
    str = str.split(/[^A-Za-z]/).filter(function(value) {return value != "";});
    for (var i = 0;i<str.length;i++) {
        tmp.push(repeatCount(str[i].split("")));
    }
    console.log(tmp);
    return str[tmp.indexOf(Math.max.apply(Math,tmp))];
}
console.log(LetterCountI("Today, is the greatest day ever!"));

非工作解决方案输出:

Array [ 2, 1, 2, 1 ] 
"Today" 

工作解决方案:

function repeatCount(word) {
    tmp = [];
    for (var i = 0;i<word.length;i++) {
        tmp.push(word.filter(function(value) {return value === word[i]}).length)
    }
    return Math.max.apply(Math,tmp);
}

function LetterCountI(str) {
    count = [];
    str = str.split(/[^A-Za-z]/).filter(function(value) {return value != "";});
    for (var i = 0;i<str.length;i++) {
        count.push(repeatCount(str[i].split("")));
    }
    console.log(count);
    return str[count.indexOf(Math.max.apply(Math,count))];
}
console.log(LetterCountI("Today, is the greatest day ever!"));

工作解决方案输出:

Array [ 1, 1, 1, 2, 1, 2 ]
"greatest"

2 个答案:

答案 0 :(得分:1)

问题是因为你的tmp数组没有在函数中使用var关键字定义。在没有var关键字的情况下定义变量会使它们成为全局范围,因此会影响另一个。

要解决这个问题,请使用var关键字声明变量,然后它们将是您期望的函数范围的本地变量。

答案 1 :(得分:1)

在您的情况下,问题是您使用变量tmp作为gloabl变量而不是局部变量。

现在,当您在for循环中调用tmp.push(repeatCount(str[i].split("")));时,tmp的值将重置为repeatCount中的空数组,但由于您使用的是全局变量,因此会影响tmp中的LetterCountI变量也是 - http://jsfiddle.net/arunpjohny/e5xxbqbu/2/

因此解决方案是在两个函数

中使用var tmp将变量声明为本地变量
function repeatCount(word) {
    var tmp = [];
    for (var i = 0; i < word.length; i++) {
        tmp.push(word.filter(function (value) {
            return value === word[i]
        }).length)
    }
    return Math.max.apply(Math, tmp);
}

function LetterCountI(str) {
    var tmp = [];
    str = str.split(/[^A-Za-z]/).filter(function (value) {
        return value != "";
    });
    for (var i = 0; i < str.length; i++) {
        tmp.push(repeatCount(str[i].split("")));
    }
    console.log(tmp);
    return str[tmp.indexOf(Math.max.apply(Math, tmp))];
}
console.log(LetterCountI("Today, is the greatest day ever!"));

演示:Fiddle