【发布时间】:2018-03-09 15:00:49
【问题描述】:
很久之后,我又玩了一遍纯 JS。我正在努力解决关闭问题。
任务:我正在使用函数工厂为返回的函数设置参数,然后我想调用该函数。
问题:据我了解,参数是通过引用传递的,当执行上下文从堆栈中弹出时,变量会导致未定义的内存空间。我怎样才能做到这一点?
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));
【问题讨论】:
-
你的开关盒在我看来不合适...
-
"变量导致未定义的内存空间" - 不,这不是 JavaScript 的工作方式。描述您的实际问题,而不是您认为的问题。
-
为什么要创建与传入参数同名的局部变量?
-
我认为您在将函数/对象分配给 indexColor 时缺少 /new/ 关键字 --- var indexColor = new changeColorConstructor(5000, 10000); --- 否则,indexColor 是对函数的引用,而不是它自己的东西。
-
@Doug 不,
indexColor将是changeColorConstructor返回的函数,这很好(以及 OP 正在尝试做的事情)。这是一个函数发生器。
标签: javascript function scope closures