我有一个问题。 我已经制作了一个函数,它给了我一组随机颜色。
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未定义?
答案 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 引入,所以每当你声明时for
和switches
内的事物,请注意这些声明被提升到函数体的顶部。因此,为避免出现这类问题,请始终在函数体的顶部声明变量。
答案 1 :(得分:1)
工作正常:
ngOnChanges
答案 2 :(得分:1)
您应该使用var
声明变量。不执行此操作意味着您要声明全局变量
因此,您在i
循环和for
中共享变量function
。
这导致i
在10
首次执行后变为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);
}