So in JavaScript, I know that when you define a variable in the global scope, like this,
let a = 0;
console.log(a); // > 0
it's (more or less) the same as defining a property on the window object:
window.a = 0;
console.log(a); // > 0, exactly the same
Is there a way to do this "window method" within the local scope a function?
The reason I ask is because you can define a getter/setter on a window quite easily (which I find very helpful, especially when I want to make personal libraries and such), and be able to use the variables it defines just like a regular variable:
let value = 0;
Reflect.defineProperty(window, 'counter', {
  get() { return value++ },
  set(v) { value = v }
});
console.log(counter); // > 0
console.log(counter); // > 1
console.log(counter); // > 2
counter = 100;
console.log(counter); // > 100
console.log(counter); // > 101
// etc
... but as soon as you put it into a function, it works, but the variable becomes defined on the window object, making it leak out of the scope of the function.
Where do variables declared inside the local scope of a function get stored? How can I define one of them with a getter/setter?
I've Tried
In this example, the variable a doesn't leak out as it isn't defined on the window object.
(function () {
  let a = 42;
  console.log(a); // > 42
  console.log(window.a); // > undefined
  console.log(this.a); // > undefined, this === window in this case
})();
... but it's not defined on this either, as this is the same as window. So then I tried binding it to a custom object:
(function () {
  let a = 42;
  console.log(window.a); // > undefined, not here...
  console.log(this.a); // > undefined,
                       // even though `this` isnt the window anymore,
                       // and it is an object that can be changed.
  console.log(this.b); // > 69, see?
}).bind({ b: 69 })();
(note: using new (function () { ... })() does the same as this bind example)
tl;dr
(function () {
  let value = 0;
  Reflect.defineProperty(this, 'counter', {
    get() { return value++ },
    set(v) { value = v }
  });
  counter; counter; // increment twice
  console.log(counter); // > 2
  counter = 100;
  counter; counter; counter; // increment thrice
  console.log(counter); // > 103
  // etc
})();
console.log(counter); // > 104
// ^ this should throw an error saying that counter
// isn't defined, but it is - on the window. I only
// want it defined within the function scope.
- Is there a way to define a variable only within the local scope a function?
- Where do variables declared inside this local scope get stored? How can I define one of them with a getter/setter?
 
    