However, there are some special cases where variable scope is smaller than a whole function, e.g. within list comprehensions.
Or we can think of a list comprehension as a function doing a loop/collect under the scenes.
I don't really understand the logic behind this comment. You're pointing this out like it's some contradiction in people's opinion.
But it's not like "block scope" is the one and only determinant of whether a language is good or bad, so lack of that alone would negate the above statement.
js could be bad and python good, regardless of whether Python lacks block scope. Doubly so since js also lacks it by default, and has only sort of tacked-it on with let/const.
But the even better answer is that both are languages with different strenghts and tradeoffs, that JS did have several bad design decisions early on, that both have evolved, and x=bad, y=good is a fanboi reaction, not a developer reaction.
Programming is a tool, with the goal being building things that help the user.
And this is supposed to be bad because?
They had a problem, used a language to solve it, they've solved it, end of story.
If they're satisfied with their solution, and it works for their purpose (and for their companies/organizations purposes), who is to day it's not OK?
Perhaps they are professionals doing a job, not dilettante nerds trying different languages and idioms for fun...
Since JavaScript tends to have many more unnamed functions defined in the middle of long functions, compared to Python (which tends towards named functions, classes, or comprehensions), block scoped variables (or more precisely simple and rigorous rules about scoping) are much more useful and important in JavaScript than they would be in Python, since if there is a part of a Python function where some variable shouldn't be visible it's probably a long and complex function which can and should have its variable scopes refactored apart.