I\'m having trouble understanding why, in strict mode, a syntax error occurs when delete
is used on an unqualified identifier.
In most cases, it makes s
You are talking about Section 11.4.1, paragraph 5.a. of the specs:
- Else, ref is a Reference to an Environment Record binding, so
a. If IsStrictReference(ref) is true, throw a SyntaxError exception.
b. Let bindings be GetBase(ref).
c. Return the result of calling the DeleteBinding concrete method of bindings, providing GetReferencedName(ref) as the argument.
What you called "unqualified identifiers" is officially named "Environment Record binding".
Now, to your question. Why throw a SyntaxError when 5.c. would fail anyway? I think you answered it yourself!
Strict mode must do a runtime check here, because a TypeError is thrown when this is encountered.
That's right. But it's always better to fail fast. So, when there is a chance of detecting a SyntaxError (at parse time), that opportunity should be taken.
Why? It saves you the trouble of fixing your app if an error occurs. Think about IDEs that may show you the error right away, as opposed to hours of debugging.
Also, such restrictions may be advantageous for optimized JIT compilers.