Javascript closure?

后端 未结 2 1571
不知归路
不知归路 2020-12-11 11:35

Method # 1

function transform(ar) {
    var alStr = [];
    for(var i=0; i

        
2条回答
  •  春和景丽
    2020-12-11 12:02

    In Method #2 there are two problems:

    1. You are returning the key name, a, rather than the array value, ar[a]. That is, rather than return a; you want return ar[a];.

    2. The function will always refer to the last value looped through because it references the same scope object. To create a new scope object you will need a closure, a with block, or a bound function.

    With a closure:

    for(var a in ar) { 
      var O = (function(val) { 
        return function() { 
          return val; 
         }
      })(ar[a]);
      alStr.push(O); 
    }
    

    With a with block:

    for(var a in ar) { 
      with({val: ar[a]}) {
        alStr.push(function() { 
          return val; 
         });
      }
    } 
    

    With a bound function:

    for(var a in ar) { 
      var O = function(x) { return x; };
      alStr.push(O.bind(null, arr[a]));
    } 
    

提交回复
热议问题