Javascript引用错误:未定义最小值
我试着用匿名函数和命名函数来概括我的想法,我这里有一段Javascript代码:Javascript引用错误:未定义最小值,javascript,function,Javascript,Function,我试着用匿名函数和命名函数来概括我的想法,我这里有一段Javascript代码: travelNode = min = function(travelNode) { console.log(travelNode); if(travelNode.left === null) return travelNode; else return min(travelNode.left); }(travelNode.right
travelNode = min = function(travelNode) {
console.log(travelNode);
if(travelNode.left === null)
return travelNode;
else
return min(travelNode.left);
}(travelNode.right);
当我尝试运行此块时,我得到一个引用错误:未定义min
。但是,当我将代码更改为:
travelNode = function min(travelNode) {
console.log(travelNode);
if(travelNode.left === null)
return travelNode;
else
return min(travelNode.left);
}(travelNode.right);
而且效果很好
显然,第一个使用匿名函数,第二个使用命名函数。然而,为什么第二个能工作,而第一个不能?我该如何修理第一个
编辑:这是整个代码块-
delete: function(data) {
var deleteHelper = function(travelNode) {
if(travelNode === null)
return null;
if(data < travelNode.data)
travelNode.left = deleteHelper(travelNode.left);
else if(data > travelNode.data)
travelNode.right = deleteHelper(travelNode.right);
else {
if(travelNode.right === null)
return travelNode.left;
else if(travelNode.left === null)
return travelNode.right;
travelNode = min = function(travelNode) {
console.log(travelNode);
if(travelNode.left === null)
return travelNode;
else
return min(travelNode.left);
}(travelNode.right);
}
return travelNode;
};
this.root = deleteHelper(this.root);
}
delete:函数(数据){
var deleteHelper=函数(travelNode){
如果(travelNode==null)
返回null;
if(数据travelNode.data)
travelNode.right=deleteHelper(travelNode.right);
否则{
if(travelNode.right==null)
返回travelNode.left;
else if(travelNode.left==null)
返回travelNode.right;
travelNode=min=函数(travelNode){
console.log(travelNode);
if(travelNode.left==null)
返回travelNode;
其他的
返回最小值(travelNode.left);
}(travelNode.right);
}
返回travelNode;
};
this.root=deleteHelper(this.root);
}
var g=function f(){…}
将作用于函数内部的f
(因此在函数外部未定义);它将被分配到it外部的g
(其范围覆盖it内部)。因此,您可以在内部和外部调用函数f
,以及g
f
不会被篡改,因为它只在闭包中有价值;而g
可以重新定义,这可能会破坏您的代码
在第二个示例中,min
在函数内部定义(但不在函数外部);因为你在里面用,而不是在外面用,所以一切都正常
在第一个示例中,创建了一个匿名函数。然后用(travelNode.right)
调用它。函数执行并中断(因为尚未分配min
)。如果函数没有错误地完成,则返回值将同时分配给min
和travelNode
(就像y=x=Math.sqrt(4)
将2
分配给x
,并且在计算Math.sqrt
之后也将y
)
您可以使用括号,并使其正常工作:
travelNode = (min = function(travelNode) {
console.log(travelNode);
if(travelNode.left === null)
return travelNode;
else
return min(travelNode.left);
})(travelNode.right);
在这里,您构造一个匿名函数,将其值赋给min
,然后调用它;由于min
已分配且在范围内,因此它仍然有效
可以说,您的第二种方法是最好的,因为您只从内部使用min
;它对调试也有额外的好处,因为函数不会在堆栈跟踪中显示为匿名函数。var g=function f(){…}
将在函数内部作用域f
(因此它在函数外部未定义);它将被分配到it外部的g
(其范围覆盖it内部)。因此,您可以在内部和外部调用函数f
,以及g
f
不会被篡改,因为它只在闭包中有价值;而g
可以重新定义,这可能会破坏您的代码
在第二个示例中,min
在函数内部定义(但不在函数外部);因为你在里面用,而不是在外面用,所以一切都正常
在第一个示例中,创建了一个匿名函数。然后用(travelNode.right)
调用它。函数执行并中断(因为尚未分配min
)。如果函数没有错误地完成,则返回值将同时分配给min
和travelNode
(就像y=x=Math.sqrt(4)
将2
分配给x
,并且在计算Math.sqrt
之后也将y
)
您可以使用括号,并使其正常工作:
travelNode = (min = function(travelNode) {
console.log(travelNode);
if(travelNode.left === null)
return travelNode;
else
return min(travelNode.left);
})(travelNode.right);
在这里,您构造一个匿名函数,将其值赋给min
,然后调用它;由于min
已分配且在范围内,因此它仍然有效
可以说,您的第二种方法是最好的,因为您只从内部使用min
;它对调试也有额外的好处,因为函数不会在堆栈跟踪中显示为匿名函数。var g=function f(){…}
将在函数内部作用域f
(因此它在函数外部未定义);它将被分配到it外部的g
(其范围覆盖it内部)。因此,您可以在内部和外部调用函数f
,以及g
f
不会被篡改,因为它只在闭包中有价值;而g
可以重新定义,这可能会破坏您的代码
在第二个示例中,min
在函数内部定义(但不在函数外部);因为你在里面用,而不是在外面用,所以一切都正常
在第一个示例中,创建了一个匿名函数。然后用(travelNode.right)
调用它。函数执行并中断(因为尚未分配min
)。如果函数没有错误地完成,则返回值将同时分配给min
和travelNode
(就像y=x=Math.sqrt(4)
将2
分配给x
,并且在计算Math.sqrt
之后也将y
)
您可以使用括号,并使其正常工作:
travelNode = (min = function(travelNode) {
console.log(travelNode);
if(travelNode.left === null)
return travelNode;
else
return min(travelNode.left);
})(travelNode.right);
在这里,您构造一个匿名函数,将其值赋给min
,然后调用它;因为分配了min
,并且在sco中