0

これが私のコードです:

var handleCondition = function(condition,params){
  var dup_condition;
  dup_condition = condition;

  var isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  };

  var __replace = function(str){
    var reg_slot = /^#(.+)/;

    if(reg_slot.test(str) == true){
      var ss = reg_slot.exec(str)[1];
      return params[ss];
    }else{
      return str;
    }
  };

  var compare = function(a){
    var arr = a;
    if(params != undefined){
      for(var j =1;j<arr.length;j++){
        arr[j] = __replace(arr[j]);
      }
    }
    switch(arr[0]){
      case "$eq":
      case "==":
        return (arr[1] == arr[2]);
      default:
        return (arr[1] == arr[2]);
      }
    };

  if(isArray(dup_condition)){

    var im = function (arr){
      for(var i=0;i<3;i++){
        if(isArray(arr[i])){
          arr[i] = im(arr[i]);
      }
    }
    return compare(arr);
  };
  var res = im(dup_condition);
    return res;
  }
};

/*Here are test data*/
var c = {
  "beforeDNS":
  ["$eq","#host",["$eq",10,10]]
,
  "afterDNS":["$match",/^10\.+/,"#ip"]
};

var params ={
   host:"dd"
};

console.log(c["beforeDNS"]); // ==>  ["$eq","#host",["$eq",10,10]]
handleCondition(c["beforeDNS"],params);

console.log(c["beforeDNS"]);  // ==> ["$eq","dd",true]
handleCondition(c["beforeDNS"],params);

期待される結果でコードを初めて実行したとき。
しかし、関数を 2 回目に実行しようとすると、驚いたことに、 の値がc["beforeDNS"]予期せず変更されました。
実際、このグローバル変数の値を変更するコードを関数に書いていませんが、変更されただけです。
この不思議な結果の理由を見つけるのを手伝ってください.

4

2 に答える 2

1

あなたのdup_condition変数は何も複製していません。これは、渡した引数への単なる参照です。

したがってim、引数をその場で変更する関数にそれを渡すと、参照と変更が行われますcondition(それ自体がc["beforeDNS"]関数の外側で定義されたものへの参照です)。

これを修正するには、sliceまたはより洗練された方法を使用して、実際に引数を複製します。 sliceたとえば、新しい配列を返します。ただし、これは浅いコピーにすぎないことに注意してください。その配列内の参照は、引き続き同じオブジェクトを参照します。

例えば:

if (isArray(condition)) {
  var dup_condition = condition.slice();
  // ...
}
于 2013-11-12T06:21:23.213 に答える
0

JavaScript では、オブジェクトは参照によって渡されます。つまり、in はhandleCondition dup_conditionまだ同じ配列を指しています。したがって、そこで変更すると、渡されたオブジェクトが実際に変更されます。同じことを示す短い例を次に示します。

var globalData = {
    arr: [10, 20]
};

var handleData = function(data) {
    var privateData = data;
    privateData.arr.shift();
    privateData.arr.push(30);
}

console.log(globalData.arr);
handleData(globalData);
console.log(globalData.arr);

スクリプトの結果は次のとおりです。

[10, 20]
[20, 30]

http://jsfiddle.net/3BK4b/

于 2013-11-12T06:26:24.190 に答える