escope icon indicating copy to clipboard operation
escope copied to clipboard

Is ES6 parameter scope not supported?

Open getify opened this issue 6 years ago • 1 comments

Apologies if this is a known problem. I couldn't quite tell from my review of existing issue threads.

My problem is related to the scopes set up by this code:

var x = (a,b = () => a) => { var a = 2; return [a, b()]; }
x(5);  // [2,5]

As you can see from the result output, the parameter list peculiarly has its own scope which is distinguishable when there's a closure in the parameter list. The a of value 5 is different from the a of value 2.

So, I would expect to get 4 scopes here from escopes:

  1. The outer scope
  2. The main function (x()) scope
  3. The intermediate parameter scope (where the parameter a and b comes from)
  4. The scope of the b() function

However, (3) is missing from the escopes output. Moreover, the a (parameter) and b (parameter) are recorded as belonging to the function (x()) scope. Usually that wouldn't matter and would be OK, but when there's a parameter list closure, it matters. There should be 3 variables (both as and the b) in the function, but there's only 2.

This inaccuracy is affecting my usage in ESLint, which I believe uses escopes. I can't fully accurately detect that a parameter is used or not if I cannot distinguish between the two as in that above code snippet.

getify avatar Mar 13 '19 20:03 getify

@getify I believe eslint uses a fork https://github.com/eslint/eslint-scope

But I'm having the same issue over there https://github.com/eslint/eslint-scope/issues/34

shannon avatar Apr 24 '19 21:04 shannon