bootstrap-dropdown.js clearMenus() needs ; at the end #3057

englishextra opened this Issue Apr 13, 2012 · 289 comments


None yet

bootstrap-dropdown.js when minified with JSMin::minify produces error in Firefox error console saying clearMenus()needs ;

on line:

  !isActive && $parent.toggleClass('open')

if in source code this is corrected -- no error in minified version

fat commented Apr 14, 2012

nope - that's a bug in jsmin. Probably should let @douglascrockford know about it though. thanks!

edit: The code had already been changed to an if when i suggested the jsmin issue be filed as a bug. Bootstrap and jsmin play very well together.

@fat fat closed this Apr 14, 2012

That is insanely stupid code. I am not going to dumb down JSMin for this case.


TC39 is considering the use of ! as an infix operator. This code will break in the future. Fix it now. Learn to use semicolons properly. ! is not intended to be a statement separator. ; is.

fat commented Apr 15, 2012

i have learned to use them, that's why there isn't one present.


i have learned to use them, that's why there isn't one present.


@sferik sferik referenced this issue Apr 15, 2012

Add semicolon #3069


Any language with syntax arguments is clearly broken, compilers deal with this. Dart, I guess.

adrusi commented Apr 15, 2012

if you really wanted to get rid of the semicolons (though I really don't see the point of that, is it really that bad that it's worth worrying about it?), ! ... && in this context an be replaced with ... ||.


coffeescript ftw?

otherwise, if you're doing real javascript, do it right?

p.s. (I'm not a coffeescripter yet, but it looks more and more like the right tool every day)


i have learned to use them, that's why there isn't one present.

Wow. I've read @fat's reasoning for not using semis, but when it comes to actual problems cropping up in the real world, why does "aesthetic" preference take precedence? Why write something like

!function( $ ){
}( jQuery )

just to avoid placing a semi a the end?

! is clearly not meant to do this job. It's a bool operator. Does the fact that the symbol looks prettier really matter?

I am well aware that you can hack your way around this and keep saying "nuh uh!" instead of admitting that it's ill conceived and improving, but seriously: making a snippy response like that just makes you look like an immature hipster smarting off to a battle worn professional. @douglascrockford is on the technical committee for fuck's sake.


This has nothing to do with being a hipster, and I have no idea why anyone seems to think it does. The simple fact is this code runs on ALL browsers without issue. Regardless if the fact that X version of javascript somewhere in the Y future will stop supporting it (maybe) does NOT give a reason for a javascript minifier to NOT correctly minify it.

Also if Crockford thinks this is insanely stupid code and he is on the technical committee then why is this insanely stupid code even possible?


I know who @douglascrockford is but who is this @fat fellow?


Also if Crockford thinks this is insanely stupid code and he is on the technical committee then why is this insanely stupid code even possible?

Being on the technical committee in 2012 for a language initially created 16 years ago probably doesn't grant him authority to radically change things like that.

mdo commented Apr 15, 2012

@zacstewart Jacob wasn't trying to snippy, he was responding directly to one person's aggressive remarks. Taken out of context I can understand how it might look that way, but side-by-side, there's no issue there.

All Jacob pointed out was that this is a bug in someone else's code and that guy comes in guns blazing instead of speaking calmly and objectively? I call bullshit on the whole situation. If semicolons aren't required, then we don't need to include them. It's as simple as that.

jack9 commented Apr 15, 2012

The simple fact is this code runs on ALL browsers without issue. Regardless if the fact that X version of javascript somewhere in the Y future will stop supporting it (maybe) does NOT give a reason for a javascript minifier to NOT correctly minify it.

Forcing unwanted paradigms has no business in code reviews.

Tools that reformat code can break code if the code is dependent on whitespace. Javascript is dependent on whitespace due to semicolon insertion. Javascript minification is not part of the language. So the code is correct for the author and they should not use a tool that breaks it.

I agree that the code runs and my first statement speaks to the freedom of an author to do as they wish. The freedom to code as they see fit. Those are compelling reason to NOT change it. However, the reality is that very few individuals will use the code unminified and the question of "correctness" falls to common convention as a matter of pragmatism. The middleground is to add a semicolon for general use of the code. Branch it and have a nice bootstrap-dropdown-minification_safe.js - There's nothing wrong with changing the code as you see fit to meet your needs.

Do not demand to change a tool because you want to use the tool in a way another author has explicitly said they will not support. That's hypocrisy. That's why people are getting upset.

s3u commented Apr 15, 2012

Learn to interop with existing toolset folks! This is a ridiculous debate.


Semicolons ARE the recommended practice... not just from Crockford, but also in Google's JS style guide:


@eligrey - line break or not, Javascript never ends a statement if the next token is an infix or bracket operator. See for some possibly surprising examples.

So if ! becomes an infix op, then newline + ! will no longer be equivalent to ; + !.

tszming commented Apr 15, 2012

nope - that's a bug in IE. Probably should let @BillGates know about it though. thanks!

Do you agree with this?

While I agree that JSMin can be improved for this case, but you also :)


If anyone is curious about the TC39 proposed syntax for the ! infix operator, here it is


Disagree with Mr. @fat approach: you distribute the code to developers and don't want to listen to good practices that are advised. I would have refactored the code when I had faced complaints from the users.

jace commented Apr 15, 2012

Thanks to the stand-off on this issue, I have to maintain my own branch of Bootstrap with semicolons inserted so that it minifies gracefully. Keeping my repo in sync is not fun at all, so I'm deploying out-of-date versions with my apps.

Given how much pain making production use of Bootstrap was, it felt like a version 0.2, not 2.0.


Clearly JSMIn isn't changing. That means Bootstrap can either add semicolons, or have people run into this issue again with JSMin. That's stupid, just use semi-colons.

Also, being a hugely popular library, people who have never developed a thing in their life are probably going to learn from bootstrap code - and emulate it. Then this newbie is screwed. Some brave soul decides to get his idea into the real world, finds bootstrap as it's the best thing out there for making beautiful apps, seeks to modify things, and picks up bad habits. Embracing bad habits is a dis-service to the whole JS community.

That's not cool.

Newbies are going to use bootstrap. They are going to learn from bootstrap.


Don't use JSMin with this project. Write documentation for newbies explaining why they shouldn't use JSMin. Don't tell the maintainer he has to do x or y for his own project. Fork it if you feel strongly enough to change the code.

@fat shouldn't change his code to work with JSMin and @douglascrockford shouldn't change his code so bootstrap can work with it. Just document why it doesn't work and move on?

jyap808 commented Apr 15, 2012

Agreed, if you're making a general purpose tool like Twitter Bootstrap, make it as compliant as possible and use good practices.

Don't be a JavaScript hipster. Add semi-colons.

This is JavaScript. Relying on implicit insertion of semi-colons is stupid.


This minifies just fine via Rails' asset precompiling - I've never ran into an issue with it. IMHO, this is my issue with JavaScript as a language being much too flexible and forgiving.


tl;dr: use Coffeescript if you don't want semicolons.

Semicolonless Javascript is an ego-stroking attempt at rejecting standards for the sake of rejecting standards, not for the greater benefit of the community. While the need for hacks exists just to get around using semicolons, the practice does greater harm than good. "Use semicolons at the end of a statement" is a far simpler rule than "never use semicolons, except sometimes you have to use x hack, like prefixing with a !." All this for the benefit of an opinionated aesthetic? I propose that one might as well use Coffeescript instead, if the intent is prettier code by standards set as a lack of syntactic symbols.

Or, just write clean, standard (as defined by not just the specification, but as defined by the developer community) Javascript, if it is to be shared, used, and contributed to by the greater community.


@douglascrockford: Regardless of whether you consider this usage of ASI a bug, it'd be ignorant not to acknowledge that there certainly is a bug in JSMin.

aroc commented Apr 15, 2012

At the end of the day, the repo maintainers can do whatever they please. We're not paying to use Bootstrap. They can include ASCII fingers all over the place if it makes them happy. If we don't like it, we can use something else or fork it. That said, I still think this discussion is valuable (minus the aggression), as these sorts of conversations get people thinking more deeply about code standards and how they fit into our everyday work as developers.

jrz commented Apr 15, 2012

Even though a semicolon might be 'better'. The syntax is correct, and jsmin should NEVER change or break working code.
Period. so either stop using jsmin, or start fixing jsmin.


@ChadMoran I believe he's talking about putting the ! in front of that code.


@ChadMoran I think the point is function(){...}(); vs !function(){...}()


/* Title: Immediate functions
Description: syntax that enables function execution as soon as it is defined

(function () {
console.log('watch out!');

//alternative with less parentheses
!function () {
console.log('watch out!');

// reference

teiman commented Apr 15, 2012

The point of using C syntax is to have ";" and "{" "}" to make sysntax and flow intend obvious to other programmers. This code is not obvious to other programmers (its not to me) so fix it by adding ";" on the end of expressions. Thanks.


I don't think talking this much about a semicolon is worth it.

Does refusing to use a semicolon make the code go faster? NO
Does it make the code harder to read and understand? YES
Will it break in the future? Probably
Does it have the bigger potential for future bugs? YES

Semicolon insertion was a mistake in JavaScript, along with eval, with and function scoping. People should be avoiding these instead of abusing them.

Semicolons are better for readability: if I see a diff, I know exactly where the line ends.

pyalot commented Apr 15, 2012

I take it you really read ecmascript262 (and I assume you did because you use it as an excuse for the bad practice of omitting semicolons) then you should realize that JS grammar is ambiguous. It's particularly ambiguous where it's about what constitutes a statement if you omit a semicolon. Browsers implement heuristics when trying to parse it (a fancy word for guessing) and as a result don't always agree between each other. Because humans aren't very good at parsing a context-sensitive grammar and executing an approximate state-machine and if/else decision tree to figure out if something is a statement or not, we punny humans tend to do it wrong every once in a while, even if we're extremely well versed and hold the entire JS grammar in our heads (which would be a considerable feat).

Fortunately, there's a "fix" for this lamentable human condition. The fix is just to insert semicolons, even though technically it's not required in all cases. But I promise you, the time wasted writing out that semicolon is more than compensated by the time you will not spend hunting down heisenbugs due to browsers differing understanding of statements, the time not spent trying to make your JS code compatible to all JS-manglers (like JSmin, closure compiler etc.), the time not spent arguing in favor of an outdated and obviously bad practice with random people on the internet AND the time not spent fixing all your code when a browser implements a newer revision of JS.

shawwn commented Apr 15, 2012

Hello everyone,

I've forked JSMin and implemented the desired behavior:

It scans for "newline [whitespace] exclamation" and replaces the newline with a semicolon.

I hope this proves useful to someone (perhaps to the authors of Bootstrap). It was a fun project.

jace commented Apr 15, 2012

@shawnpresser This means deploying your version of JSMin on all my systems, plus ensuring your version is in sync with upstream JSMin.

Why can't we instead just replace all \n! with \n;! in Bootstrap? It's easier and doesn't affect production environments.


Writing JavaScript without semicolons is like doing all of your HTML in quirks mode, with improper nesting, unclosed

  • tags, and unquoted attribute values.

    Just as HTML was designed so that a webpage would still probably look ok even with a sloppy idiot writing markup in HotDog, JavaScript was designed so that people writing code in Notepad would still probably get something workable if they forgot a semicolon here and there.

    Doesn't make it the "right" way to do it.

  • @pyalot
    pyalot commented Apr 15, 2012

    @shawnpresser that's wonderful, can you please implement it as well for the YUI compressor, googles closure compiler, dean edwards packer and microsoft ajax minifier?


    Having experience using Bootstrap 1.4 on a large JS application, I can tell you that Bootstrap (1.4 at least) falls apart when uglified.


    Any fool can write code that a computer can understand. Good programmers write code that humans can understand. ~Martin Fowler

    jlnr commented Apr 15, 2012

    Couldn't @douglascrockford's JSMin just output an explanatory fatal error in this case, for the reason outlined in the third reply here?
    All programs that pass JSMin would still be syntactically intact. And JavaScript non-wizards (like me) would not sit there with broken code produced from two parts which we thought we could rely on.

    (And a big thanks to unknown for deleting all the meme/boobs.gif crap replies!)

    shawwn commented Apr 15, 2012

    @pyalot I could try.



    "fat: The reason it was closed is because semicolons were added to the end of lines in 1.4. In 2.0 we removed them again when we introduced the downloader as it safely concats and minifies these files for you. I'm adding semicolons to the end of files in 2.0.1 - which will likely be released tomorrow, to support this mobile oddity."

    cvn commented Apr 15, 2012

    “Be liberal in what you accept, and conservative in what you send.”

    lcdt commented Apr 15, 2012

    @shawnpresser Your fork does not minify this example correctly:
    if (confirm('Are you sure?') &&

    shawwn commented Apr 15, 2012

    @lcdt fixed; thanks.


    tl;dr Someone finds bug in JSMin, people that use Bootstrap (for free) make demands and lecture the authors about the one true way to write JavaScript.


    +1 to @istvan-antal @ajacksified @pyalot
    Egos does not do any good to community. When you are a library developer, sometimes you have to go with the not so nice implementation to support as many users as possible. If you just don't want this, then, don't share your code, remove it from GitHub, and continue close-sourced. The main goal of open sourcing, sharing, GitHubbing... is being open to real facts. Javascript uses semicolons, everywhere. Its like the issue on leaving a comma at the end of an array definition in javascript. Its valid, but... IE breaks. So, just delete them.
    (I can't imagine this people getting married )

    pyalot commented Apr 15, 2012

    @madrobby TL;DR two tools are incompatible to each other with each author claiming what they do is the one true way. However one tool (JSmin) is deployed across the entire JS ecosystem at countless locations site authors have no influence whatsoever, and the other is ignoring sage advice from one of our elders, you decide!

    P.S. we now also have a gazillion forks of JSmin and bootstrap, both of which are virtually useless for different reasons. If you fork JSmin you'd have to convince everybody in the foodchain to use the forked JSmin or you're still gettting screwed at places you have no choice about, and the bootstrap forks would have to keep up with the primary upstream (bootstrap) or they're quickly getting to a derelict unmaintained state.


    What is with this new group of JS developers that refuse to use a semi colon? You're idiots. Use the semi colon like you're supposed to do.

    cowboy commented Apr 15, 2012

    The solution to a problem like this is very simple. Project maintainers need to consider who the target audience for their project is, and maintain their project in such a way as to properly set and meet the expectations of that target audience.

    I would imagine that the target audience for Twitter Bootstrap generally:

    • doesn't know the rules of JavaScript ASI
    • doesn't know how to choose the right tools
    • doesn't understand how to debug errors in the tools they use
    • needs all the help they can get

    Which means that it might be a good idea to consider:

    • adopting a coding style that does as much as possible to help keep them out of harm's way
    • documenting things the project does that might not conform to their expectations
    • making explicit recommendations on tools and processes

    Ever since I started actually teaching JavaScript, I've learned a lot about how to help reluctant JavaScripters (read: the 99%) read and write code. Omitting all semicolons except where absolutely necessary for proper ASI definitely doesn't help them.

    Also, when responding to a user issue like this one, consider the first list. The user doesn't know what tool they should be using. The user doesn't know what's really going on. They've most likely inherited some arcane stack of tools that they can't discard, and need all the help they can get.

    (and passing the buck isn't really "help")


    Looking for a technical solution ("just use semicolons everywhere") is not going to help with a social problem (reluctance to properly learn JavaScript).

    cowboy commented Apr 15, 2012

    Also, regarding the setting of expectations, one of the most prominent headers on the Twitter Bootstrap homepage is Designed for everyone, everywhere.

    Just in case there was any confusion as to whom this project was designed for.


    documenting things the project does that might not conform to their expectations

    Like mentioning in the INSTALL or README that th script MAY NOT be compatible with this or that minifier.

    Would sound like a compromise solution to all three parties -- the Bootstarp,the JSmin and some developper.

    But it isn't. Have to keep my own readme.txt for every library with notes upon their potential bad behavior then implementing into production.


    @madrobby that's pure arrogance. What about people in the process of "properly learning" Javascript?

    pyalot commented Apr 15, 2012

    @madrobby funny you should say that because I always considered "properly learning javascript" to involve reading the spec, subsequently being horrified about the ambiguity in statement interpretation and henceforth using semicolons. Obviously there's a different level of comprehension, the one which doesn't read the entire ecmascript262 and stops at the paragraph about 1/4th down in the document that states semicolons are optional, but doesn't actually make it down to the grammar.


    @madrobby Are you seriously implying that users of either JSMin or bootstrap shouldn't be making recommendations to the authors of said libraries? Come on now... that's how open source works.

    Crockford, while abrasive and aggressive, has pointed out that bootstrap has a high likelihood of breaking in the future with in standard JavaScript if they continue to use a specific "style". The point being that relying on ASI (a set of rules that change, at least according to TC39) is not as reliable and future-proof as just using semicolons. Presenting it as an argument about the "one true way" is spurious. Here we have someone who, for better or worse, is helping shape the future of JavaScript telling someone their code will break, and that advice being ignored. For what reason? So the code looks pretty? This isn't about the "one true way"... this is about saying that using semicolons is a best practice, because it'll mean your code has a better chance of staying semantically correct in the future.

    relrod commented Apr 15, 2012

    +1 semicolons.


    Apart from the semicolon issue, what's wrong with signifying your intent in your code rather than abusing the logical operators:

    if(!isActive) {

    It's a tough issue either way. If Crockford changes JSMin to accept this input, JSMin is helping devs write code that'll possibly break in standard JS in the future. If he doesn't, he'll be not accepting input that works in all flavors of JS right now.

    Apreche commented Apr 15, 2012

    Reason to use semicolons - code will work properly and people will be able to get work done.

    Reason not to use semicolons - aesthetics and ego.

    Are you adults or children?


    Entertaining thread :) You clearly have first world problems. Come on, it is just some extra characters which is also best practice. Not fixing a problem that you otherwise could in 2 seconds is not very smart move for whatever reason.


    For the folks out there using Django compressor, see this issue: django-compressor/django-compressor#237

    tmgreen commented Apr 15, 2012

    +1 semicolons


    You guys are all really angry lol...

    It's simple, you want a semicolon there. Fork the repo and add it yourself and shut your mouth. Problem solved.

    It's fat's choice, and let it be. Don't try and shove your ahole lectures on why semicolons are used in herpy derps javascript library therefore must be used in everyones.

    There are plenty of forks that solve this problem, or you could just open notepad and add one at this spot.

    Nobody has any right of demanding someone who does something for his free time to change anything (assuming Twitter doesn't sponsor this, which I don't think they do?). If you have a problem with it, that's why they invented open source... so you can download it and add myfacesmells_ to the beginning of every variable.

    mvrak commented Apr 15, 2012

    Semicolon insertion is a backup... a bonus.... relying on it is insanely stupid.


    @dubcanada, Twitter does not sponsor it, as per Mark and Jacob's words in some other thread.


    If you have pigeon shit on your shoulder and I dare to mention it to you then you can say that "Hmm, I see it but it looks good there, I also know that pigeon, his name is Dave, now move on." or you can just say "Thanks dude, I didn't notice it".

    Btw you are right there should be a different branch called "Twitter bootstrap (with semicolons)"


    Here, I'll fix this thread:

    s/insanely stupid/potentially incompatible and therefore not advised/g
    s/dumb down JSMin/allow JSMin to accept input that goes against TC39 because it might break future compat/g
    s/learn to use semicolons properly/please start using semicolons, as that will help ensure future compatability./g


    Add the stupid semicolon already. The longer the delay, the more painful it will become.


    Or just use UglifyJS? I don't recall it having problems with that issue.


    It's not painful to fat. He doesn't give a crap... it's painful to the morons in this thread trying to force him to add it, rather then just adding it themselves when they download.

    Also saying that some possible change in the future might break this is stupid. That's like saying you shouldn't use X function in php because it may be deprecated in 2020. Or you shouldn't use any HTML5 attribute because the spec is not done and it might change.

    dbounds commented Apr 15, 2012

    Regardless of whether semicolons are best practice or not, the fact jsmin is breaking existing, functional non-minified code is a flaw.


    It also works with I believe and is actually smaller then jsmin.

    Both are positives!

    Or you could just not minify your javascript, in this day and age with the amount of bandwidth we all have. It really would not be a big deal.


    @dubcanada , why so angry? I personally don't care if bootstrap adds the semicolon. I can easily add the semicolon myself. What I care about is other people having their stuff break because neither crockford nor fat are willing to budge here.

    The advice I gave about future compat might be a case of YAGNI, or it might not be. Only time will tell. But look at the possible outcomes:

    Crockford adds support: 1. Accept input that may break in the future. 2. Accept more input that works right now. 3. Crockford acknowledges that while it's harder and potentially riskier to not use semicolons, it's still perfectly valid right now, and his tool should just be minifying, not enforcing a standard (that's what JSLint is for).

    Fat adds semicolon: 1. Have your code be potentially more future-proof. 2. Make your code work with JSMin. 3. Bow to the practice that adding semicolons increases compatability with existing tools and is easier than not using semicolons.

    Neither budges: 1. Other forks must be constantly maintained to add semicolons to make it work with JSMin, or otherwise abandon JSMin as a reliable minifier.

    I personally think @fat should just add the semicolon given the options above. If you disagree, fine, but it doesn't make either of our arguments stupid.

    nallar commented Apr 15, 2012

    @dbounds I think you might want to try I think it would successfully minify this, although I haven't tested myself.


    "Or you could just not minify your javascript, in this day and age with the amount of bandwidth we all have. It really would not be a big deal." @dubcanada

    Someone's clearly never heard of a mobile data plan, or lived in a country that doesn't happen to have one of the fastest pipes in the world.

    nallar commented Apr 15, 2012


    Even on fast connections, minifying is important. Of course, other things should also be done for maximum increase in speed - minify, concatenate, gzip.


    @nallar Of course, I was just pointing out the obvious.


    Whether or not one agrees with ASI, it is in the current spec. Therefore, that JSMin does not support this line of code would make it non-compliant. Imagine if you used the same argument to try and get out of paying taxes? "That rule is stupid and I don't follow it"?

    Douglas Crockford, bless his soul, is known for not being overtly diplomatic. I don't think he should change JSMin because in my view that would be compromising "Crockford". However, that does make his product less universal -- and that's good. People should be using JSMin because Crockford wrote it, not because it's expected to work everywhere. The idea is that if JSMin doesn't work on a given codebase, it's probably because Crockford wouldn't approve of that codebase -- and if that's important to you, then you know what to do: avoid Bootstrap!

    Then again, I have to wonder if this battle of integrity is worth losing potential Bootstrap users. Besides, it wouldn't be too hard to prefix punctuation on the beginning of newlines with ; -- a technique often employed by proponents of ASI. Changing the code to ;!isActive would satisfy concerns while having neither person sacrifice on their ideals.

    EDIT: or just do what @jed below me says, which is smarter. I think the world would run a little smoother if we all felt, ASI and semicolon users alike, that punctuation on the beginning of a new line that doesn't have a semicolon in front of it is a code smell in javascript.

    jed commented Apr 15, 2012

    i'm 100% with @fat on the semicolons, but don't understand the benefit of writing the very fragile

    !isActive && $parent.toggleClass('open')


    isActive || $parent.toggleClass('open')

    is shorter and

    if (!isActive) $parent.toggleClass('open')

    is clearer, and neither break as easily.


    @fat shouldn't be adding a semicolon because it makes the codebase too big.
    People keep complaining "Boo hoo hoo, twitter is so bulky and laggy!", and then they contradict themselves by requesting the codebase get larger with needless semicolons. smh, people these days....


    @fat You opened this as open source. When you do that you should be respectful of the people who will be using your code. That means adding semi-colons so we can all pick whatever minifier we want. But hey, i guess being a dick about the code you released as open source works too.

    pyalot commented Apr 15, 2012


    Object f has no method 'forEach'

    var foo = 'asdf'

    undefined is not a function

    var foo = function(){}

    number is not a function

    var foo = 1+2
    ('asdf' + 'blubb').toUpperCase()

    will compress wrong

    var foo = /asdf/
    var foo = function(){}
    var bar = function(){}

    Yes, @fat, if you give me a free sandwich, I DEMAND THAT YOU GIVE ME THE PROPER SERVING OF MAYONNAISE, as dictated in Proper Sandwich Specification JB-332. To withhold the proper serving of mayonnaise, as dictated by the sandwich community, clearly means that you are a dick, whereas I am a simple and humble masticator who's just trying to consume the sandwich that you handed me for free without any loss of mayonnaise taste that I desire. I shall toss your free sandwich aside until you give me the sandwich that I clearly deserve. After all, Douglas Crockford gave me a free sandwich, and it had exactly the right amount of mayonnaise and it creamed my mouth just right. The problem is obviously you, so hurry up and FIX MY FREE SANDWICH, and don't you dare ever try to hand me free food again without meeting these minimum sandwich specifications.


    @jed +1. Also, @nkwiatek, you're right. I think you've just reversed my opinion. Also, David Herman, another TC39 member, has indicated that TC39 will not be breaking existing code.

    In this case, @douglascrockford should support this correct code, even if it's against his preference, or he shouldn't call it a JS Minifier, he should call it a "Douglas Crockford Flavored JavaScript minifier".

    But also, @fat should change the code in the way @jed suggested. A bit of compromise on both sides so we can move on already.

    jed commented Apr 15, 2012

    @pyalot none of which appear in the offending snippet. let's stay on topic.


    "...making a snippy response like that just makes you look like an immature hipster smarting off to a battle worn professional."
    "You're idiots. Use the semi colon like you're supposed to do."
    "Are you adults or children?"
    "But hey, i guess being a dick about the code you released as open source works too."


    What's immature are the needless personal attacks against @fat over a coding style.


    @kitcambridge No, he released it as open source. Being disrespectful to the developers using it and then other developer's tools because it doesn't work with your code is wrong. It's not even about if he likes semi-colons or not or his coding style. It's open source. Be nice to the people who are using your code for god's sake.

    nallar commented Apr 15, 2012


    As far as I can see, JSMin doesn't claim to follow the spec - it claims to work on what jslint says is ok. I think works on the spec, although I haven't tried it. I believe the reason JSMin doesn't is to make it smaller(and faster!).


    Can't tell if serious. If you are... a minifier gets rid of a newline character instead... and much more. Otherwise, carry on! :)


    @matthewdl Telling developers who are legitimately trying to use your code that they just dont know how to use semi-colons and that everyone else needs to work around their coding style is wrong in the open source world. It's about working together not trying to boost your ego.


    @matthewdl If you want to talk about "sandwiches" and how it relates, it'd be like giving away a free one (great!) and when they ask for a napkin you respond with "well, I know how not to spill it on myself, maybe you should learn to not make a mess on yourself too."


    @jldailey my whole point was you didn't have any arguments except some snobby attitude towards a programming language. Against someone just going further and declaring a language unpleasant and calling who embrace it "plumbers", what am I supposed to argue? Start categorizing you or calling names? Whatever. I just had to state my opinion on a project that I hold some interest and this is going out of control. Have fun with painting, plumbing or whatever your thing is.

    isaacs commented Apr 17, 2012

    Can someone at @twitter please block @trevr? This user is a child getting off on trying to incite ill will.


    @egeozcan you missed the point of the plumber analogy, it wasn't to
    judge plumbers (who are very smart and productive people, they just
    have different values). Let the painters paint, let the plumbers

    Interoperating with jsmin.c is worth $0 and no cents to a painter.
    But, it's value must be "obvious" to a plumber.

    But, it's wrong to call a painter insane or stupid because he doesn't
    care about the same things you do (that was the point of the echo, in
    case you missed that rhetorical point)... thats the argument: people
    who call others "insane" and "stupid" for having a different POV are
    just being belligerent and should be ignored, authority is irrelevant,
    and productivity a red herring.

    The most common corollary of authority is belligerence, not access to
    "truth" (or, "the right way").

    sferik commented Apr 17, 2012

    To those who believe nothing positive came from this debate, I offer this.


    Oh for fuck sake stop rabbiting on!!!

    Sent from my Windows Phone

    From: Jesse Dailey
    Sent: 2012-04-17 20:17
    To: Gareth Bradley
    Subject: Re: [bootstrap] bootstrap-dropdown.js clearMenus() needs ; at the end (#3057)

    @egeozcan you missed the point of the plumber analogy, it wasn't to
    judge plumbers (who are very smart and productive people, they just
    have different values). Let the painters paint, let the plumbers

    Interoperating with jsmin.c is worth $0 and no cents to a painter.
    But, it's value must be "obvious" to a plumber.

    But, it's wrong to call a painter insane or stupid because he doesn't
    care about the same things you do (that was the point of the echo, in
    case you missed that rhetorical point)... thats the argument: people
    who call others "insane" and "stupid" for having a different POV are
    just being belligerent and should be ignored, authority is irrelevant,
    and productivity a red herring.

    The most common corollary of authority is belligerence, not access to
    "truth" (or, "the right way").

    Reply to this email directly or view it on GitHub:
    #3057 (comment)

    isaacs commented Apr 17, 2012

    For maximum safety, use the semicolons module in npm. When you require('semicolons'), they are required.


    @jldailey you better don't judge them, I just didn't like that you tried to categorize people. You just can't, the people in the JavaScript community are just too diverse. You called a tool, which a lot of people love to work with, an "excrement". How do you decide that "interoperating with jsmin.c is worth $0 and no cents to a painter"? I never defended anyone calling others names. Maybe they know each other and they are close enough to be able to say those things; who knows. However most of the people here are just trying to break a resistance which they see (or think) is unnecessary. They are not just "painters", "plumbers" or "hipsters". They are just making valid arguments to make a change in a project in which they have some interest or even contribution, perhaps. If you think that code beauty is more important in this project which has the slogan "designed for everyone, everywhere" and mainly used as a quick boilerplate for websites, I can only agree to disagree. It is not a war on semicolons. It's about making this project work "everywhere" as the slogan states.

    ravi commented Apr 17, 2012

    For those responding to @jldailey, especially with the "Crockford is smarter than you" type stuff, please scroll all the way back and see where this tone ("insanely stupid code") was set.

    Additionally, I don't see the problem with the painter vs plumber analogy. Plumber is clearly not being used in a derogatory sense, unless you think @jldailey means Van Gogh when he says "painter".

    FWIW, I may be a minority of one here for I think the semicolon is a good idea because of aesthetic reasons!


    Nobody has any right of demanding someone who does something for his free time to change anything (assuming Twitter doesn't sponsor this, which I don't think they do?).

    @dubcanada you might want to check out under which organization account this repo is hosted. If you provide a software for people to use, then you should listen to them and adopt their needs. On the other hand, you are right about the forking part. Just fork the repo and use it as you see fit. But this is not gonna change the fact that omitting semicolons is a bad practice.

    On the other hand, you might wanna watch this part of this video


    @egeozcan Of course no individual is ever a perfect instance of a class. That doesnt mean you can't talk about classes of people and the things that make them more similar to each other than they are to others. It is naive to think otherwise, and it's a strawman to assert that I believe it (and possibly you were offended by a thought you only assumed I had).


    The un-official fork of Bootstrap for all your semicolon needs:

    Submit pull requests at your convenience!


    I came here to say this;


    Why would anyone want to take away Zoidberg's eyes?

    (V) (;,,;) (V)


    +1 to @douglascrockford for "That is insanely stupid code."


    +1 to @ryantenney for +1ing @douglascrockford's beautiful words.

    teiman commented Apr 18, 2012

    Some PHP...

    function g($tag,$code){  return "<$tag>".$code. "</$tag>"; } 
    echo g(table,g(tr,g(td,"hello world").g(td,"!")));

    this output:

    <table><tr><td>Hello world</td><td>!</td></tr></table>

    Actually, nobody on the PHP community write code like that. Because all PHP programmers know better...


    This comment thread is long and pointless enough to be worthy of Reddit. </FLAMEBAIT>

    On the other hand, if it keeps going, this dramatic story of semi-colons could be novelized and eventually turned into box office gold. Hmm... no time to start like the present...

    Jacob Thornton leaned back in his chair, folding his hands behind his head. He was left with another free afternoon in the offices of Twitter from all the time saved in not inserting unnecessary semi-colons. Yes, life was beautiful.

    Suddenly, Douglas Crockford stormed into his office, red-faced and sweating. "You asshole!" shouted Doug. Jacob sat up quickly and jolted the desk, nearly toppling his mocha frappuccino. Doug continued his tirade: "What's this lack of semi-colon shit that broke JSMin? It's insanely stupid code. Learn to write JavaScript properly or I will fucking end you." ...

    (to be continued)


    @matthewdl We need illustrators for that memorable story.

    alekop commented Apr 18, 2012

    Over 200 comments over a missing semicolon?? For fuck's sake people, don't you have any work to do?!


    @englishextra That's a good idea. Got ideas for some? In the meantime, I've moved the story here:

    Edit: I have since extended this scene and I expect David Fincher to call any second with a movie deal.


    Who could have guessed that missing semicolons would lead to the creation of Thornton/Crockford slash fiction?


    @alekop apparently you don't have one either.

    ravi commented Apr 18, 2012

    +1 on @englishextra suggestion -- definitely the comic route is the way to go. Who knows, perhaps there shall be a SuperColon... no wait...

    @alekop congratulations on the 201st comment. And it's not even 5:01 yet. :-)


    @alekop .. just consider /. maybe we can be as OT and pointless!


    While I myself don't care so much either way about semicolons (whatever performs fastest is best IMHO), I imagine someone can write a tool to + or - ; to their preference. I also find it ironic that the pro-; is on GitHub:

    Do your best to never use a semicolon. This means avoiding them at line breaks and avoiding multi-statement lines.
    But, "Style Guides" are just that; guides.

    yuanyan commented Apr 20, 2012

    Be careful with Semicolon-free!


    @tomByrer that's a horrible reference and one should never look at that page. As @haliphax indicated, If Javascript didn't require semicolons, then it wouldn't be called "Automatic Semicolon Insertion". This sentence should end the discussion but apparently didn't .


    I need to teach some programmers JavaScript and make sure they are ready in 3 weeks. Should I explain them all the rules of ASI? Aren't we supposed to make our fellow developers' lives easier? Who do we code for really?

    johnloy commented Apr 20, 2012

    Ok, just because it's Friday and this thread is so entertaining:
    Alt text


    Someone with power (@douglascrockford ?) needs to set things in motion to make semicolons required in the spec. QED

    isaacs commented Apr 21, 2012

    @sbussard Do you know what QED means?

    Making semicolons required in the spec would be a web-breaking change. TC-39 will never do that.


    @sbussard right, then all of the people's code will break. Changing something drastically would be the same as stabbing someone as @douglascrockford said. That's why they cannot do that.


    @isaacs this argument is the best reason to add semicolons to the spec. QED — as was demonstrated by this argument. A couple regex replacements could fix pretty much all of that. Wasting time on dumb little disagreements is the real web-breaking problem. ■

    isaacs commented Apr 21, 2012

    @sbussard HAHAHAHa, dumb disagreements are web-breaking, that's what the web is FOR.


    yet we consider ourselves engineers... :/


    "You cannot make progress without making decisions." -- Jim Rohn

    dbarros commented Apr 22, 2012

    If the reason for not including a semicolon was aesthetics, then one wouldn't do something like this:

    Dropdown.prototype = {
        constructor: Dropdown
      , toggle: function (e) {
          var $this = $(this)
            , $parent
            , selector
            , isActive

    Those dangling commas, in the middle of nowhere, really do look bad.


    If you're still reading this.. you really should go out and PLAY!


    damn these notifications I've been getting lol! #PLAY


    Mr. Madison, what you've just said is one of the most insanely idiotic things I have ever heard. At no point in your rambling, incoherent response were you even close to anything that could be considered a rational thought. Everyone in this room is now dumber for having listened to it. I award you no points, and may God have mercy on your soul.

    gtczap commented May 2, 2012

    Seeing how @fat responded to this reminds me of how dumb it would be to use a library maintained by someone who doesn't value quality and reason, but makes decisions merely 'because they feel like it'. Pretty things built on a poor foundation aren't worth much to me. This is a great way to prune your user base.


    The drama of this Github thread has now been forever immortalized.



    The drama of this Github thread has now been forever immortalized.

    Read the story with pleasure


    This thread can be summarized in two images:


    Deal wit it

    h3 commented May 3, 2012

    Ugly code that works > nice looking code that doesn't work.

    Stop being a dick and put a god damn semicolon already, it's the best practice anyway.


    Yep, congrats, you guys are now famous. Twitter devs fighting over a semicolon in a code that apparently isn't broken is pretty hilarious. You should probably finish off this disussion before (and if) Twitter's shares goes public on the stock market.


    only geeks can fight over something like this.

    teiman commented May 14, 2012

    FTFY Only greeks can fight over something like this.

    "You will go you will return not in the battle you will perish"


    Someone should just create a library that can semi-colon-ify the semi-colon free code, then we could use lint, and minifiers without extra work. And, no standards need broken, and this code can be considered valid. Much the same as having a opinion on whether brackets go on the same, or next line, or the method of indentation (# spaces, or tabs, etc...)

    I personally use semicolons, 2 or 4 spaces for indenting, and keep my brackets on the same line. I don't see any reason to crucify fat for his style of code, and I also don't see why douglascrockford needs to have JSMin parse this kind of code. At this moment, JSMin not parsing the code is not a bug, but a choice.


    They did. Its called CoffeeScript


    What we need is more fat / crockford fan fiction.


    Can you please just add semicolons? By omitting them you are causing me and my team a big headache. Thanks!


    @ scryptonite
    "whether brackets go on the same, or next line"
    Ask crockford about that one also!

    freeall commented Jun 8, 2012

    I missed parts of this. What did we all agree on in the end?


    In the end the guy who considers himself a hypster engineer wrapped the stuff into if statemanet:


      if (!isActive) $parent.toggleClass('open')

    Furthermore he twitted that "The only reason I [fat] don't use semicolons is to troll people."

    There we are. -- Let the artists troll people and profs go on with the real progress


    I guess this is lost amongst the noise, but I think it's best to listen to Brendan Eich discussing this thread and Automatic Semicolon Insertion (ASI):

    ASI is (formally speaking) a syntactic error correction procedure

    The point is that semi colons are actually required, it's just that your error in excluding them can be automatically corrected (in most cases). So it seems clear to me that it's better to write correct code, in the format as it will be when actually run, rather than rely on automatic error correction.


    It's important to remember that this struggle may lead to the end of all life as we know it.



    @pete-otaqui SO TRUE!

    I don't understand why anyone would WANT to depend on "error correction" to "fix" their code for them.

    tunnuz commented Jul 6, 2012

    Ok, how do I unsubscribe from this?


    Just reply with "unsubscribe" in all caps

    frewsxcv commented Jul 6, 2012

    @tunnuz Look at the bottom of this page, below the "Comment on this issue" button

    NARKOZ commented Jul 30, 2012

    wamatt commented Sep 9, 2012

    @NARKOZ epic win on an already hilarious thread :D

    tomasdev commented Nov 6, 2012

    I think this is all about @fat trying to be hipster. You know... step over all style guides currently available at the moment. YAY!

    Personally, I like, and I think the only correct answer is the first @douglascrockford comment. There's nothing else to add.

    flavius commented Nov 24, 2012

    For the record, this was worth a talk:


    Just want to be part of web history. Haha... Hilarious.


    "For verily I say unto you, Till heaven and earth pass, one jot or one tittle shall in no wise pass from the law, till all be fulfilled." -Matthew 5:18

    fcntl commented Dec 12, 2012

    You should always use semicolons with curly-brace languages.

    wprl commented Feb 13, 2013
            You don't have to put periods at the end.
                                    At the end of sentences.
     But it can make them easier to read.
     On the other hand 
        there's no real reason not to
            just do whichever you want
    enrmarc commented May 14, 2013

    Well, I just want to be part of this;


    Yes, it certainly has become legendary;

    On Tue, May 14, 2013 at 4:08 AM, Enrique wrote:

    Well, I just want to be part of this;

    Reply to this email directly or view it on GitHub

    @vogdb vogdb referenced this issue in vogdb/Leaflet.ActiveLayers Jun 5, 2013

    Douglas Crockford 101 ;) #1


    "The only true law is that which leads to freedom" (R.Bach)

    Any style question starting with "why don't you..." has an easy answer: "because this is my style".

    If you like semis, you use them; if you don't, you don't use them. What can be easier?



    That would be perfectly true if this was just a style issue. And I'd be
    100% behind you if that was the case. Unfortunately this is about much more
    than styling. JavaScript needs the semicolons to function logically.
    On 27 Jun 2013 06:02, "Vlad Patryshev" wrote:

    "The only true law is that which leads to freedom" (R.Bach)

    Any style question starting with "why don't you..." has an easy answer:
    "because this is my style".

    If you like semis, you use them; if you don't, you don't use them. What
    can be easier?

    Reply to this email directly or view it on GitHub


    There might be something else we want to focus on, leave the semicolons alone.



    Please use semicolons. Readbility is important. Maybe, you, @fat, know how and when using semicolon but it's not the case for all. Rookies, kiddies and even experts could need semicolon to read the code. So, please, add it for readability...

    @mgechev mgechev referenced this issue in mgechev/angularjs-style-guide Oct 7, 2013

    Update the AngularJS wiki instead of a standalone repo #14

    torifat commented Feb 24, 2014

    Why don't we just get rid of indentations too??? It's really OPTIONAL. And, also MINIMALISTIC.

    All the current IDE's are doing it wrong. Either they should give diff background colors to the different scopes or show them AII (AUTO INDENT INSERTED).

    @cvrebert cvrebert locked and limited conversation to collaborators Jun 9, 2014
    @automatic-frog automatic-frog added a commit to osp/ that referenced this issue Jan 1, 2015
    @automatic-frog automatic-frog Dealing with programmers who leave out semicolons because it’s pretty t…
    Thus, adding in some semicolons to make it work with jsmin
    Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.