WeakMap/Map/Set are available in V8 for quite some time. You just need to
run with --harmony.

(Though storing anything in a WeakMap with a string key might lead to a
hard to explain memory leaks).

Vyacheslav Egorov
On Jul 7, 2012 6:28 PM, "Rick Waldron" <[email protected]> wrote:

>
>
> On Saturday, July 7, 2012 at 10:28 AM, Mariusz Nowak wrote:
>
> This is the use case we were missing, you want to do same thing I've once
> tried to do in domjs https://github.com/medikoo/domjs
> Currently I think there's no better solution than polluting global scope.
> In domjs I resolved it by introducing dynamic scope (
> https://github.com/medikoo/domjs/blob/master/lib/dscope.js ).
>
>
> This is a good use case for WeakMaps; they aren't available in v8 stable yet,
> but would eliminate the leaky references that could be held in the current
> implementation.
>
> Rick
>
>
>
>
>  but it's not great approach as variable assignments live only during
> function execution, and that's confusing. I think best solution would to be
> have possibility to run modules in some predefined lexical scope, but it's
> not that easy to achieve.
>
> On Saturday, July 7, 2012 3:55:26 PM UTC+2, ajlopez wrote:
>
> Thanks!
>
> I usually do in your suggested way, and I'm with you. But in this special
> case, I feel the user of my module could find a bit weird to write
>
> var st = require('simpletags');
>
> st.html(st.head(st.title('...'**)), st.body(st.h1(....))
>
> instead
>
> html(head(title('....')), body(h1('...'))
>
> in a controlled way (only in its own module). I want to give him/her an
> option. Ruby has it (as an option, too). It's the first time I found I
> needed it in Node.js. Usually, I assert "Ruby ceremony > Javascript/Node.js
> ceremony", but now, I was trapped by this issue.
>
> My best solutions:
>
> a)
> var st = require(...); // and use with st.h1, st.h2...
>
> b)
> require('simpletags').**exportsTo(global); // maybe in browser I could
> export to windows directly in the module
>
> c)
> var simpletags = require('simpletags');
> eval(simpletags.**exportLocalCode()); // where .exportLocalCode returns a
> String with "var h1 = simpletags.h1; ... "
> c2)
> var st = require('simpletags');
> eval(st.exportLocalCode('st'))**; // the local variable name 'st' should
> be informed to be used in var ...= .... string result
>
> On Sat, Jul 7, 2012 at 10:38 AM, Mariusz Nowak <[email protected]>wrote:
>
> In modules you can achieve the same by assigning function to global: e.g.
> `global.foo = function () { .. }` it will work same as `this.foo = function
> () { ... }` in REPL. but I would strongly discourage this, relying on
> global scope is bad practice.
>
> I'd say that unless you're using regular require/export logic to share
> objects between modules, you're doing something wrong. Try to think just
> with require/exports and then you should quickly find way home. See how
> module relations in other packages work.
>
> --
> Mariusz Nowak
> https://github.com/medikoo
> http://twitter.com/medikoo
>
>
> On Saturday, July 7, 2012 3:18:51 PM UTC+2, ajlopez wrote:
>
> Thanks for the suggestion!.... but...  I missing some part of your answer.
>
> I guess I understand the difference btw global, this.property, and var
> local. And then, I understand why it not works. What I don't understand is
> how to circumvent/solve the problem. I don't know if your answer is:
>
> a- " you'll get the answers :) " and then, you will know that it's
> impossible to solve, or too weird
> b-  you'll get the answers :) " and it's possible in this (simple)
> way.....etc...
>
> AFAIK, it's "a". Am I right?
>
> My problem is:
>
> - module1 requires module2
> - I want to use the exposed functions of module2 as they were defined in
> module1, using dynamic names. That is, it's not a solution
>
> var module2 = require('module2');
> var Function2 = module2.Function2;
>
> Usually, I did a bit of experiment at REPL. I found that this works:
>
> var name = 'Function2';
> this[name] = ...
>
> var obj = new Function2(); // without using this
>
> BUT it's only works at REPL. So, encouraged by this discovery (I expected
> it will not work), I hoped to make it works in other context.
>
> Now, I understand why it is work in REPL. Notably, in REPL
>
> this == global
>
> so it's possible to emulate
>
> var foo = ...
>
> with something like (pseudocode)
>
> name = 'foo'
> var [name] = .....
>
> writing
>
> name = 'foo';
> this[name] = ...
>
> and then foo is available "as if it is" a local var.
>
> But inside a running .js, this is not equal to global. I was tricked by
> REPL ;-)
>
> So, the better solution I found so far is to put something like this in
> module1:
> // http://stackoverflow.com/**qu**estions/5625569/include-**extern**
> al-js-file-in-node-js-**app<http://stackoverflow.com/questions/5625569/include-external-js-file-in-node-js-app>
>
> var fs = require('fs');
> var vm = require('vm');
>
> var includeInThisContext = function(path) {
>     var code = fs.readFileSync(path);
>     vm.runInThisContext(code, path);
> }.bind(this);
>
> includeInThisContext(__dirname + '/module2.js');
>
> console.log(foo); // it's defined
>
> where module2  define foo:
>
> foo = {};
>
> BUT IN MY CASE, module2 doesn't define the functions at its own context:
> https://github.com/ajlopez/**Sim**pleTags/blob/master/lib/**simple**
> tags.js<https://github.com/ajlopez/SimpleTags/blob/master/lib/simpletags.js>
> it uses an array to dynamically define and export functions.  I never have
>
> function h1() {
> }
>
> function h2() {
> }
>
> defined at module2 context. And I don't want this. My DSL defines a
> function for each HTML tag.
>
> Now, I want to have these dynamically defined functions from
> module2 accessible in outer module1, as they were local to it.
>
> I could write inside my module,
>
>  var h1 = makeTag('h1');
> var h2 = makeTag('h2");
> ...
> ....
>
> for dozens of tags, and then use something like includeInThisContext....
> but I feel it's too weird.
>
> Apparently, my problem is: I didn't find a way to define a local var with
> a dynamic name.
>
> The original DSL in Ruby:
> https://github.com/dlitvakb/**de**klarativna/blob/master/test/**te**
> st_deklarativna.rb<https://github.com/dlitvakb/deklarativna/blob/master/test/test_deklarativna.rb>
>
> use "include dslmodule". And inside the dsl module, it defines dynamically
> named functions at module top level. So the functions are automatically
> available to the module that makes the includes.
>
> That is the "trick" I didn't found how to emulate in
> Node.js/require/CommonJS world.
>
> Some links in my research:
> http://stackoverflow.com/**quest**ions/5833978/javascript-**how-**
> to-use-dynamic-local-**variables<http://stackoverflow.com/questions/5833978/javascript-how-to-use-dynamic-local-variables>
> http://stackoverflow.com/**quest**ions/5094862/how-do-i-**access-**
> a-local-variable-**dynamically-**via-a-string-form-**of-its-name-**fro<http://stackoverflow.com/questions/5094862/how-do-i-access-a-local-variable-dynamically-via-a-string-form-of-its-name-fro>
> http://stackoverflow.com/**quest**ions/598878/how-can-i-**access-**
> local-scope-**dynamically-in-**javascript<http://stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript>
> http://stackoverflow.com/**quest**ions/2336508/javascript-**get-**
> access-to-local-variable-**or-**variable-in-closure-by-its-**nam**e<http://stackoverflow.com/questions/2336508/javascript-get-access-to-local-variable-or-variable-in-closure-by-its-name>
> http://stackoverflow.com/**quest**ions/1119335/javascript-**local-**
> variable-declare<http://stackoverflow.com/questions/1119335/javascript-local-variable-declare>
>
> The better approach I found in these links is to use eval (!!??):
> eval("var "+name+ " = ....");
>
> Am I right? the only ways are the above ones? Or is another way?
>
> Any suggestions?
>
> Angel "Java" Lopez
>
>
> On Sat, Jul 7, 2012 at 9:27 AM, Mariusz Nowak <[email protected]> wrote:
>
> @ajlopez get to know how variable scoping in JavaScript works (what is
> global, how this and how local variable works), and you'll get the answers
> :)
>
>
> On Saturday, July 7, 2012 2:11:56 PM UTC+2, ajlopez wrote:
>
> Hi people!
>
> A very simple question. When I write in the Node repl:
>
> this.foo = 'bar';
> console.log(foo);
>
> it's ok, foo is defined. But writing that code in file.js and running
>
> node file.js
>
> then foo is not defined.
>
> Or require('file.js'), then foo is not defined.
>
> Any way to define a variable in the "current context"? Apparently, "this"
> properties and "current context" top variables are the same in REPL, but
> they are not the same in .js, or inside a required module.
>
> I want to do this in a dynamic way:
>
> name = 'foo';
> // ...
> this[name] = 'bar';
>
> so
>
> foo = 'bar';
>
> is not a solution in my context.
>
> I could use:
>
> global[name] = 'bar';
>
> but I want to expose the new "current context" top variables only in my
> "current context" without pollute the global environment.
>
> I encountered this problem when coding a simple HTML DSL:
> https://github.com/ajlopez/**Sim****pleTags/blob/master/test/**expor****
> tsTo.js<https://github.com/ajlopez/SimpleTags/blob/master/test/exportsTo.js>
> I want the DSL functions to be accesible as:
>
> require('simpletags').**exportsT****o(????); // ???? == global? this?
> Now, I should use global to make it works in any situation
>
> then, use the exported function as functions in current context:
>
> html(body(h1("TheNextBigThing"******)));
>
> instead
>
> var st = require("simpletags");
>
> st.html(st.body(st.h1("**TheNext****BigThing")));
>
> Any other way?
>
> TIA
>
> Angel "Java" Lopez
> http://ajlopez.wordpress.com
> @ajlopez
> gh:ajlopez
>
>  --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines: https://github.com/joyent/**node**/wiki/Mailing-List-*
> *Posting-**Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> nodejs+unsubscribe@**googlegroup**s.com<nodejs%[email protected]>
> For more options, visit this group at
> http://groups.google.com/**group**/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>
>
>  --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines: https://github.com/joyent/**node/wiki/Mailing-List-**
> Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> nodejs+unsubscribe@**googlegroups.com<nodejs%[email protected]>
> For more options, visit this group at
> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>
>
>  --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>
>
>  --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to