苦苦挣扎的功能工厂&关闭

时间:2018-03-09 15:00:49

标签: javascript function scope closures

很长一段时间后,我再次使用普通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));

2 个答案:

答案 0 :(得分:2)

据我所知,您的问题不在于闭包或函数工厂,而在于switch

switch(metric) {
    case metric >= greenLimit:

此代码将metricmetric >= greenLimit的结果进行比较,即它的工作方式与if (metric == (metric >= greenLimit))类似。

metric >= greenLimit可以是truefalse,因此将其与metric进行比较并没有多大意义。

在下面的代码段中,我已根据您的switch / if级联替换了您的else声明,并且我已删除了荒谬的{{1}分配。

&#13;
&#13;
var greenLimit = greenLimit;
&#13;
&#13;
&#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));