javascript - Explaining JS closures in the terms of perl -
i understand without problems how perl's closures works, next one
use 5.012; use strict; use warnings; sub countdown { $start = shift; return sub { $start-- } } $c10 = countdown(3); while( $_ = $c10->() ); i'm trying understand next piece of javascript:
var runinsandbox = (function(js, inputpath) { (function() { if ((!context.initialized__query)) { return createcontext(); }; })(); (function() { if (typeof(inputpath) !== 'undefined') { (process.argv)[1] = inputpath;; (context)["__dirname"] = path.dirname(inputpath);; return (module)["filename"] = inputpath;; }; })(); return vm.runincontext(js, context, "sibilant"); }); no chance! :( please can rewrite above to perl ? know perl bit - me extremely useful understanding js basics , constructions like:
(...)() - more precisely (function(){.....})() double (( in if
if ((!context.initialized__query)) { or next
(context)["__dirname"] = ;; or
return (module)["filename"] = inputpath;; // why double ;;? and if coul'd suggest me resource like: learning javascript perl programmers - nice ;)
ps: js (shortened) here: https://github.com/jbr/sibilant/blob/master/lib/cli.js
i'm not extremely well-versed perl closures, @ least try demystify you.
the form:
(function(...) { ... })(); is self-invoked anonymous function1. means write out anonymous function, , invoke immediately. done encapsulation2. example, if end creating bunch of variables, don't want pollute global namespace, can put inside anonymous, self-invoked function. however, in case don't see why first invocation necessary @ all, since it's checking flag or something. stranger return inside self-invoked functions. aren't being assigned anything. hazard guess createcontext() initializes context variable, return in there useless. same goes following:
return (module)["filename"] = inputpath;; as far double (( , )), seem largely unnecessary , i'm not sure why author put in there. example:
if ((!context.initialized__query)) isn't different from:
if (!context.initialized__query) also, parentheses in following unnecessary, double semicolons:
(context)["__dirname"] = ;; honestly, looks poorly-written javascript, or perhaps javascript autogenerated (this case).
you rewrite so:
var runinsandbox = function(js, inputpath) { if (!context.initialized__query) { createcontext(); }; if (typeof inputpath !== 'undefined') { process.argv[1] = inputpath; context["__dirname"] = path.dirname(inputpath); module["filename"] = inputpath; }; return vm.runincontext(js, context, "sibilant"); }; notes:
- in perl,
sub { ... }->(). - in perl, 1 use
{ $var; ... }instead ofsub { $var; ... }->(),do { $var; ...; expr }instead ofsub { $var; ...; return expr; }->().
Comments
Post a Comment