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
实际上意味着什么吗?它像指针吗?一个新变量被建立了,是的,但这个变量被分配了一个对对象的引用。它就像有意义,但指的是对象本身,而不是内存地址。关于这一点有很多问题。这里是一个起点: