Javascript ReferenceError: min is not defined
Javascript ReferenceError: min is not defined
我想让我的头围绕匿名和命名函数我有这个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
还没有被赋值)。如果函数没有错误地完成,返回值将同时赋给min
和travelNode
(就像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
;它对于调试还有一个额外的好处,因为该函数在堆栈跟踪中不会显示为匿名。
相关文章:
- reactRedux is not defined
- ReferenceError: not defined
- ReferenceError: cordova is not defined @ng-cordova.min.js:7
- jQuery is not defined - WordPress footer.php
- GAPI Is Not Defined
- Page_ClientValidate is not defined
- ReferenceError: $firebase is not defined
- ReferenceError: crimeID is not defined
- AngularJS: $scope is not defined?
- ajaxUrl is not defined
- WebView: Uncaught ReferenceError: Android is not defined
- ReferenceError SetInterval not defined
- ReferenceError: yes is not defined
- ReferenceError "not defined"
- Soundcloud API ReferenceError: $ is not defined (JavaScript)
- Angular: Compile is not defined
- nodeJS phantom ReferenceError: Promise is not defined
- observableArray is not defined
- Uncaught ReferenceError trapArea/Per is not defined
- ReferenceError: xmlhttp is not defined