function - Javascript ReferenceError: min is not defined -


i'm trying wrap head around anonymous , named functions , have javascript code here:

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

when try , run block, referenceerror: min not defined. however, when change code this:

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

and works fine.

obviously, first 1 uses anonymous functions , second named function. however, why second 1 work first 1 doesn't? how fix first one?

edit: here's entire code block -

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() { ... } scope f inside function (so undefined outside it); assigned g outside (which has scope on insides of it). result, can call function f inside, , g both inside , outside. f safe tampering, since has value in closure; while g can redefined, potentially breaking code.

in second example, min defined inside function (but not outside it); since use inside not outside, works.

in first example, make anonymous function. invoke (travelnode.right). function executes, , breaks (since min not yet assigned). if function complete without error, return value have been assigned both min , travelnode (just y = x = math.sqrt(4) assigns 2 x , y after evaluating math.sqrt).

you use parentheses, , make work:

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

here, construct anonymous function, assign value min, invoke it; since min assigned , in scope, still works.

arguably, second approach best, given use min inside; has added benefit debugging, since function not show anonymous in stack traces.


Comments

Popular posts from this blog

java - UnknownEntityTypeException: Unable to locate persister (Hibernate 5.0) -

python - ValueError: empty vocabulary; perhaps the documents only contain stop words -

ubuntu - collect2: fatal error: ld terminated with signal 9 [Killed] -