javascript - Disable, or at least detect, automatic semicolon insertion - Stack Overflow

I always code in strict mode hoping to be shielded(or at least forcibly told to change my code) from pr

I always code in strict mode hoping to be shielded(or at least forcibly told to change my code) from problems with the Javascript language like using deprecated methods or misinterpretable syntax.

However I hit this problem today and I was wondering whether there was any way to disable semicolon insertion in the browser or otherwise have similar-to-strict-mode 'pile'-time errors?

JS[H/L]int doesn't happen to be able to pick up where JS interpreters would insert semicolons and flag them for us to mitigate would it?


EDIT

JShint and JSLint both error if a new line is present before a semicolon is found after a the return keyword. However, I don't know about the other caveats regarding automatic insertion and whether they are each detected too.
Regardless, if an answer actually solves the 'disabling' part, that would be more relevant.

I always code in strict mode hoping to be shielded(or at least forcibly told to change my code) from problems with the Javascript language like using deprecated methods or misinterpretable syntax.

However I hit this problem today and I was wondering whether there was any way to disable semicolon insertion in the browser or otherwise have similar-to-strict-mode 'pile'-time errors?

JS[H/L]int doesn't happen to be able to pick up where JS interpreters would insert semicolons and flag them for us to mitigate would it?


EDIT

JShint and JSLint both error if a new line is present before a semicolon is found after a the return keyword. However, I don't know about the other caveats regarding automatic insertion and whether they are each detected too.
Regardless, if an answer actually solves the 'disabling' part, that would be more relevant.

Share Improve this question edited May 23, 2017 at 11:46 CommunityBot 11 silver badge asked Aug 28, 2013 at 7:50 HashbrownHashbrown 13k9 gold badges81 silver badges99 bronze badges 2
  • Related, possibly duplicate: Way to stop ASI on node.js and have it err? – Frédéric Hamidi Commented Aug 28, 2013 at 7:54
  • 1 this doesn't restrict the answers to node, and asks for a code inspection technique as an alternative – Hashbrown Commented Aug 28, 2013 at 8:03
Add a ment  | 

2 Answers 2

Reset to default 2

The expression after return keyword MUST ALWAYS start on the same line that the keyword is, this is not interpreter related, it's defined by the ECMAScript standard, it's a bad part of the language but if you respect the rules of writing the JS code described by Douglas Crockford then you'll not encounter this again.

From "JavaScript: The Good Parts" by Douglas Crockford (Appendix A.3 Awful Parts):

JavaScript has a mechanism that tries to correct faulty programs by automatically inserting semicolons. Do not depend on this. It can mask more serious errors.

It sometimes inserts semicolons in places where they are not wele. Consider the consequences of semicolon insertion on the return statement. If a return statement returns a value, that value expression must begin on the same line as the return:

return
{
    status: true
};

This appears to return an object containing a status member. Unfortunately, semicolon insertion turns it into a statement that returns undefined. There is no warning that semicolon insertion caused the misinterpretation of the program. The problem can be avoided if the { is placed at the end of the previous line and not at the beginning of the next line:

return {
    status: true
};

Also see the code conventions for JavaScript by Douglas Crockford: http://javascript.crockford./code.html

Just thought I'd help anyone who es across this question.
I've started using Google's Closure Comiler to minify JS for a project and it gave me a few handy warnings.

   $> java -jar google_closure_piler.jar  --language_in=ECMASCRIPT5_STRICT --js_output_file 'min.js' 'file1.js' 'file2.js'
   file1.js:152: WARNING - unreachable code
               getSomething(function() { return this.doThingo(''); });
               ^

   file2.js:203: WARNING - Suspicious code. The result of the 'add' operator is not being used.
               ' to ' + (typeof obj);
               ^

   0 error(s), 2 warning(s)

The offending code blocks were as follows (the ments describe what the code was missing that the piler alerted me to):

file1.js:150

    return generateSomeObject(bunch, of, arguments)
        //the period before the function call was missing
        getSomething(function() { return this.doThingo(''); });
}

file2.js:201

if (someCondition)
    //trailing plus was missing from this line
    throw 'Could not set ' + last + ' of ' + (typeof root)
        ' to ' + (typeof obj);
return old;

I don't know whether it will recognise all mistakes that the browser tidies up (so I probably won't mark this as an answer), but it does a lot more than YUI's minifier was doing for me (which was ignoring all of these cases).
Also, pared to YUI, the piler is able to take in multiple file inputs and so can give me line numbers per file for errors, and doesn't error on/redeact the debugger keyword).
Hopefully it'll help you too.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745298377a4621281.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信