Motive behind strict mode syntax error when deleting an unqualified identifier?

后端 未结 2 1615
慢半拍i
慢半拍i 2020-12-24 15:22

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

相关标签:
2条回答
  • 2020-12-24 15:26

    You are talking about Section 11.4.1, paragraph 5.a. of the specs:

    1. 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.

    0 讨论(0)
  • 2020-12-24 15:39

    If you want to delete object in strict mode. You have to explicitly mention about the property access. Also note that, how you call the function is important. If new operator isn't used this is undefined under use strict, and you cant use the below method. Example:

    'use strict'
    function func(){
      var self = this;
      self.obj = {};
      self.obj.x = 'y'
    
      console.log(self.obj);
      delete self.obj // works
      // delete obj // doesn't work
      console.log(self.obj);
    }
    
    var f = new func();
    

    For deleting object outside of the function(closure), you will have to call like

    // same code as above
    delete f.obj
    
    0 讨论(0)
提交回复
热议问题