带循环的功能

时间:2015-12-12 20:47:41

标签: javascript arrays

我有一个问题。 我已经制作了一个函数,它给了我一组随机颜色。

function dameColoresRand(numero) {
    i=0;
    colores = [];
    while(i< numero - 1) {
        color = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
        if(color.length == 7) {
            colores.push(color);
            i++;
        }
    }
    return colores;
}

[有时颜色没有正确的语法,所以我做了一个简单的检查]

好吧,当我用循环调用函数时,例如

for (i = 0; i < 3 ; i++) {
    colores = dameColoresRand(10);
    console.log(colores);
}

我应该在我的控制台上看到3个十六进制颜色代码阵列。

为什么我只看到一个数组,而nex未定义?

3 个答案:

答案 0 :(得分:2)

那是因为您正在共享标识符i。要解决的两件事:

// inside dameColoresRand()
i=0;
var i = 0;

// before the for loop, add
var i;
// then do the looping
for (i = 0; i < 3 ; i++) {...}

解释为什么这是必要的。

在第一种情况下,如果你没有在var之前的变量赋值之前,你通过引入标识符来污染全局命名空间:编译器会:哦,让我试着找i ,它(a)要么找不到i(这是最初发生的事情),因此引入它,或者(b)找到错误的i并分配给它。

在for循环的情况下,在其他语言中{}指定一个新的范围,在javascript范围内仅由 functions 引入,所以每当你声明时forswitches内的事物,请注意这些声明被提升到函数体的顶部。因此,为避免出现这类问题,请始终在函数体的顶部声明变量。

答案 1 :(得分:1)

工作正常:

ngOnChanges

答案 2 :(得分:1)

您应该使用var声明变量。不执行此操作意味着您要声明全局变量 因此,您在i循环和for中共享变量function。 这导致i10首次执行后变为dameColoresRand,因此循环会在此之后立即跳过。

function dameColoresRand(numero) {
    var i = 0;
    var colores = [];
    while(i < numero - 1) {
        color = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
        if(color.length == 7) {
            colores.push(color);
            i++;
        }
    }
    return colores;
}

for (var i = 0; i < 3 ; i++) {
    colores = dameColoresRand(10);
    console.log(colores);
}