Brandon Benvie (2013-10-01T03:21:50.000Z)
domenic at domenicdenicola.com (2013-10-13T02:51:53.119Z)
On 9/30/2013 3:51 PM, Dmitry Soshnikov wrote: > Just re-read meeting notes, OK, cool on two scopes (seems like they > are not in the spec yet). Want to double-check though: whether it will > be possible to transpile now to ES3? From what I've seen in the notes, > the head-scope will be able to access `this` value of the activation, > etc. Not sure how to transpile now. Could someone give an example of a > wrapper scope please, and confirm whether it's transpilable now? I believe it is transpilable if you use an inner function scope. Someone correct me if my translations are semantically incorrect: ES6: ```js var x = 1, y = 2; function foo(x = 3, y = y, z = y) { return [x, y, z]; } ``` ES3: ```js var x = 1, y = 2; function foo(x, y, z) { // defaults if (x === undefined) { x = 3; } if (y === undefined) { y = y; // essentially a no-op } if (z === undefined) { z = y; } // body return (function(x, y, z){ return [x, y, z]; }).call(this, x, y, z); } ``` ES6: ```js var x = 1, y=2; function foo(x=3, y= (x = undefined, 4)) { return [x,y]; } ``` ES3: ```js var x = 1, y=2; function foo(x, y) { // defaults if (x === undefined) { x = 3; } if (y === undefined) { y = (x = undefined, 4); } // body return (function(x, y) { return [x, y]; }).call(this, x, y); } ``` ES6: ```js function foo(bar = function() { return 'param-inner' }) { var ret = bar(); function bar() { return 'body-inner'; } return ret; } ``` ES3: ```js function foo(bar) { // defaults if (bar === undefined) { bar = function() { return 'param-inner'; }; } // body return (function(bar){ var ret = bar(); function bar() { return 'body-inner'; } return ret; }).call(this, bar); } ``` A clearer example of my own which I think demonstrates the scoping better (or exposes a problem with my understanding): ES6 ```js function foo(x, y = function() { return x }) { x++; return x + y(); } foo(1); // is this 3 or 4? ``` ES3: ```js function foo(x, y) { // defaults if (y === undefined) { y = function() { return x }; } // body return (function(x, y) { x++; return x + y(); }).call(this, x, y); } foo(1); // 3 ```