[1] - Immediately Invoked Function Expressions: (function(){ ... }())
In scheme, lexical scoping is easily accomplished through the let form, and it's pretty hard to make a variable global by mistake.
So yes it does have lexical scoping in the sense that function arguments are lexically scoped, but that's the only scoping environment, and you can't hide that fact behind macros like you could in scheme if it was needed.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
There is; it's just ugly. You just have to use an immediate function as the body of the if statement.
It seems like this argument conflates lexical scoping with the requirement that variables be lexically scoped. Lexical scoping (even if optional) is extremely useful for closures. Requiring lexical scoping would very useful for safety.
function foo() {
console.log(whereDidThisComeFrom);
}
window.whereDidThisComeFrom = "the damn global object";
foo();
And: function foo() {
var a = {
whereDidThisComeFrom: "a, of all places"
};
with (a) {
console.log(whereDidThisComeFrom);
}
}
foo();
In both cases, you can't lexically resolve the identifier whereDidThisComeFrom.scheme@(guile-user)> (define (foo) (write where-did-this-come-from)) ;;; <stdin>:1:14: warning: possibly unbound variable `where-did-this-come-from' scheme@(guile-user)> (define where-did-this-come-from "the damn global scope") scheme@(guile-user)> (foo) "the damn global scope"scheme@(guile-user)>
Munificent's assertion that this doesn't represent lexical scoping is wrong, but his assertion in another thread that with() is an exception to lexical scoping is correct, and therefore JS is not lexically scoped, just mostly lexically scoped.
(To be strict, that seems to be more a matter of what a scope is, rather than if the scoping is lexical or dynamic.)
Strict mode in ES 5 does address the first two, and "let" in ES 6 addresses the latter, so that's good. But at that point, you're talking about the future and not JavaScript as it is today.