很长一段时间后,我再次使用普通JS。我正在努力解决关闭问题。
任务:我正在使用函数工厂为返回的函数设置params,然后我想调用它。
问题:据我所知,params是通过引用传递的,当执行上下文从堆栈中弹出时,变量会导致未定义的内存空间。我怎样才能做到这一点?
function changeColorConstructor(greenLimit, redLimit) {
var greenLimit = greenLimit;
var redLimit = redLimit;
console.log('1. Green Limit in Constructor shell: ' + greenLimit);
return function(metric) {
var color;
console.log('3. Green Limit in returned function: ' + greenLimit);
switch(metric) {
case metric >= greenLimit:
console.log('Green');
color = '#56C621'; // green
break;
case metric < greenLimit && metric > redLimit:
console.log('Yellow');
color = '#F2E607'; // yellow
break;
case metric <= redLimit:
console.log('Red');
color = '#C64C20'; // red
break;
default:
color = '#C0C0C0'
break;
}
return color;
}
}
var indexColor = changeColorConstructor(5000, 10000);
console.log('2. Returned function: ' + indexColor);
console.log('4. Output from production function: ' + indexColor(5000));
答案 0 :(得分:2)
据我所知,您的问题不在于闭包或函数工厂,而在于switch
:
switch(metric) {
case metric >= greenLimit:
此代码将metric
与metric >= greenLimit
的结果进行比较,即它的工作方式与if (metric == (metric >= greenLimit))
类似。
metric >= greenLimit
可以是true
或false
,因此将其与metric
进行比较并没有多大意义。
在下面的代码段中,我已根据您的switch
/ if
级联替换了您的else
声明,并且我已删除了荒谬的{{1}分配。
var greenLimit = greenLimit;
&#13;
答案 1 :(得分:-1)
当我在Switch on ranges of integers in JavaScript
上使用这种开关案例技巧时,我能够打印出'Green'。基本上,将开关设置为测试,使用布尔值'true'来比较一个案例中的范围。
function changeColorConstructor(greenLimit, redLimit) {
var greenLimit = greenLimit;
var redLimit = redLimit;
console.log('1. Green Limit in Constructor shell: ' + greenLimit);
return function(metric) {
var color;
console.log('3. Green Limit in returned function: ' + greenLimit);
switch(true) {
case metric >= greenLimit:
console.log('Green');
color = '#56C621'; // green
break;
case metric < greenLimit && metric > redLimit:
console.log('Yellow');
color = '#F2E607'; // yellow
break;
case metric <= redLimit:
console.log('Red');
color = '#C64C20'; // red
break;
default:
color = '#C0C0C0'
break;
}
return color;
}
}
var indexColor = changeColorConstructor(5000, 10000);
console.log('2. Returned function: ' + indexColor);
console.log('4. Output from production function: ' + indexColor(5000));