Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js-为什么这个局部函数可以修改全局变量?_Node.js_Scope - Fatal编程技术网

node.js-为什么这个局部函数可以修改全局变量?

node.js-为什么这个局部函数可以修改全局变量?,node.js,scope,Node.js,Scope,这是我的密码: 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 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);
var handleCondition=函数(条件、参数){
var-dup_条件;
dup_条件=条件;
var isArray=功能(obj){
返回Object.prototype.toString.call(obj)='[objectarray]';
};
变量替换=函数(str){
变量寄存器插槽=/^#(.+)/;
如果(寄存器插槽测试(str)=真){
var ss=reg_slot.exec(str)[1];
返回参数[ss];
}否则{
返回str;
}
};
变量比较=函数(a){
var-arr=a;
如果(参数!=未定义){
对于(var j=1;j[“$eq”,“dd”,true]
handleCondition(c[“beforeDNS”],参数);
第一次以预期结果运行代码;
然而,当我第二次尝试运行该函数时,出乎意料的是,
c[“beforeDNS”]
的值发生了意外的变化!
事实上,我没有在函数中编写任何代码来修改这个全局变量的值,但它只是改变了。

因此,请帮助我找到这个神秘结果的原因,或者修复它。谢谢!

您的
dup\u条件
变量没有复制任何内容。它只是对您传入的参数的引用

因此,当您将其传递给
im
函数(该函数在适当位置修改其参数)时,它只是引用和修改
条件(该条件本身是对函数外部定义的
c[“beforeDNS”]
的引用)

要解决此问题,您可以使用
slice
或更复杂的方法来实际复制参数。
slice
将返回一个新数组。请注意,尽管这只是一个浅拷贝。该数组中的引用仍将引用相同的对象

例如:

if (isArray(condition)) {
  var dup_condition = condition.slice();
  // ...
}

在javascript中,对象是通过引用传递的。换句话说,在
handleCondition
dup\u 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]

据我的理解,
var
意味着初始化一个新变量,因此我认为这样就建立了一个新变量。那么,你能解释一下在这个例子中,
var
实际上意味着什么吗?它像指针吗?一个新变量被建立了,是的,但这个变量被分配了一个对对象的引用。它就像有意义,但指的是对象本身,而不是内存地址。关于这一点有很多问题。这里是一个起点: