Javascript ReferenceError: min is not defined

Javascript ReferenceError: min is not defined

本文关键字:not defined is min ReferenceError Javascript      更新时间:2023-09-26

我想让我的头围绕匿名和命名函数我有这个Javascript代码在这里:

travelNode = min = function(travelNode) {
      console.log(travelNode);
      if(travelNode.left === null) 
           return travelNode;
      else 
           return min(travelNode.left);
}(travelNode.right);

当我尝试运行这个块时,我得到一个ReferenceError: min is not defined。然而,当我把代码改成这样:

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);
    }

var g = function f() { ... }将作用域f在函数内(因此它在函数外是未定义的);它将被分配给它外部的g(它的作用域超过它内部)。因此,可以在内部调用f函数,在内部和外部调用g函数。f是安全的,不会被篡改,因为它只在闭包中有值;虽然g可以重新定义,但可能会破坏您的代码。

在第二个例子中,min定义在函数内部(而不是在函数外部);因为你在里面使用而不是在外面,所以一切都有效。

在第一个示例中,创建了一个匿名函数。然后用(travelNode.right)调用它。函数执行后中断(因为min还没有被赋值)。如果函数没有错误地完成,返回值将同时赋给mintravelNode(就像y = x = Math.sqrt(4)2赋给x,以及y Math.sqrt的值之后)。

你可以使用括号,并使它工作:

travelNode = (min = function(travelNode) {
      console.log(travelNode);
      if(travelNode.left === null) 
           return travelNode;
      else 
           return min(travelNode.left);
})(travelNode.right);

这里,你构造了一个匿名函数,把它的值赋给min,然后调用它;因为min已经赋值并且在作用域中,所以它仍然有效。

可以说,你的第二种方法是最好的,因为你只从内部使用min;它对于调试还有一个额外的好处,因为该函数在堆栈跟踪中不会显示为匿名。