Skip to main content

Why am I finding Javascript/jQuery so difficult to get right?



My background is in C and I've picked up PHP, mySQL, HTML, CSS without too much issue.





But I'm finding Javascript/jQuery surprisingly difficult to get right. Very frustrating. Why?









  1. It seems to violate a number of traditional programming principles (e.g. variable scope)









  2. Undefined variables seem to appear out of nowhere and already have values associated with them. For example (from the jQuery docs):







    $("a").click(function(event) {

    event.preventDefault();

    $('<div/>')

    .append('default ' + event.type + ' prevented')

    .appendTo('#log');

    });







    What exactly is "event"? Do I have to use this variable name? Should I just assume that this object is magically instantiated with the right stuff and I can use any of the methods list at the JQuery API ?









  3. There seems to be bunch of random rules (e.g. return false to stop a default action, but sometimes this doesn't work?)









  4. Non-deterministic behavior when debugging. (e.g. I refresh the browser, try something and get result X for JS variables I'm watching in Firebug. I refresh again and I get result Y?)









  5. Very messy looking code that is hard to follow. What happens when? I'm using Firebug and Chrome Developer Tools, but I'm not getting enough visibility.









It seems like everyday there's some random JS "rule" that comes up that I've never seen before in any of my JS books or tutorials.





What do I need to do to make Javascript/jQuery more deterministic, controlled, and logical to me?





Are there any resources that explain Javascript's quirks/gotchas?





Thanks!



Source: Tips4all

Comments

  1. Douglas Crockford's "Javascript: The Good Parts" was an invaluable resource. Javascript plays a lot more like Lua, Lisp, or Python than C, it just happens to LOOK like C.

    Link provided to Amazon; I snagged mine from O'Reilly.

    ReplyDelete
  2. 1) It seems to violate a number of traditional programming principles (e.g. variable scope)


    You need to declare variables using var, else it will go into the global scope.


    2) Undefined variables seem to appear out of nowhere and already have values associated with them (how did this happen?)


    This is possibly related to 1) and/or 4).


    3) There seems to be bunch of random rules (e.g. return false to stop a default action, but sometimes this doesn't work?)


    You need to let the handler return false as well. E.g. form onsubmit="return functionname()". You also need to return from the "main" function, not only from a closure (a function inside a function), referring to your previous question. It would only return into the "main" function and continue on.


    4) Non-deterministic behavior when debugging. (e.g. I refresh the browser, try something and get result X for JS variables I'm watching in Firebug. I refresh again and I get result Y?)


    Probably the code was executed before the HTML DOM was finished populating. You need to hook on window.onload or $(document).ready() whenever you want to execute stuff during page load.


    5) Very messy looking code that is hard to follow. What happens when? I'm using Firebug and Chrome Developer Tools, but I'm not getting enough visibility.


    I bet that you're talking about jQuery source? It's just a large library. You should after all not worry about this when debugging. Rather worry about your own code. However, make sure that you're looking at the unminified version of jQuery's source code.



    See also:


    JavaScript: the bad parts
    What should every JavaScript programmer know

    ReplyDelete
  3. To be honest, I think you have a good understanding. Some of my hangups were similar. The way that I have been moving on is "well, if that's the way it is, then that's the way it is". Just accept the idiosyncrasies and plow forward. PHP does some of the same things (variables can show up out of nowhere, etc...). Just code the way you want to code and if it works, then great!

    Then after you get to that point start breaking out the profiler and see if there's anything that you can optimize.

    Here are a couple of things:

    If you understand CSS, then jQuery selectors should be easy. As far as the code goes, that's straightforward too if you can deal with chaining and JSON. EDIT: also, the jQuery documentation on everything is EXCELLENT! And There is no shortage of jQuery experts here on SO to help us noobs (and hopefully we can return the favor for newer noobs).

    There is a scope to work with. (Basically) anything written outside of a function or object is in global scope. If you are inside of an object or function and use var then that sets the variable's scope

    Javascript isn't like a C-based language (C++ or PHP even). It uses prototypes to deal with class/object relationships rather than a subclassing scheme.

    The #1 thing that threw me for a loop is that any JS that appears anywhere on the page or that was included in <script> tags is fair game. If you have a global variable in one script, you can use that same variable in a completely different script and it will work. That may be what you mean about variables showing up out of nowhere. Also, there are some DOM based variables that can just "show up" too.

    Anyways, I think that if you just plow ahead, you'll get some "AHA" moments. I'm a relative noob to programming, but I continually grow as long as I don't hang up on something that doesn't have too much of an impact on actually making the code run.

    ReplyDelete
  4. It's a language based on prototypal inheritance and is influenced by functional programming languages and the paradigm so it isn't completely just OO/Procedural like other languages. Variables are implied globals unless declared with var.
    Please include an example?
    return false exits out of the function as with any language's return statement. preventDefault() would be the DOM method to cancel the default behaviour of a link
    Javascript is used primarily on the client side. Since there are many user agents, each of them have a different implementation of the DOM, which is very inconsistent, moreso than JS itself. Again, please include a real example to get a definitive answer.
    You'll find messy looking code in any language, and maybe your lack of understanding perceives the code as messy, when in fact it isn't so bad. Or maybe you're looking at some minified/obfuscated code.


    I recommend http://eloquentjavascript.net/ for learning aspects of Javascript.

    Things you'll learn from the link above


    lambdas
    closures
    Prototypal inheritance
    Event based programming
    Debugging
    DOM

    ReplyDelete
  5. "JavaScript: The Good Parts" by Douglas Crockford is a good start

    In your case, the appendices ("the bad parts" and "the awful parts") might be the most interesting :)

    ReplyDelete
  6. Crockford's "Javascript: The Good Parts" gives some common JS patterns that help with variable privatization and scoping. This is for javascript in general. For jQuery I just use the API. Also the Yui Theatre videos on javascript are quite good

    ReplyDelete
  7. Javascript can be a little tricky and some of it's functional aspects confuses people. If you actually learn and understand the language you'll find it really useful, most people just randomly start using it and then just hate.

    Read javascript the good parts by crockford, it's really helpful: http://javascript.crockford.com/

    Also make sure you understand closure. It's a fundamental that people don't get but often use.

    ReplyDelete
  8. In terms of variable scope, there are local and global variables. One of the gotchyas of variable scope can be seen in this example:

    var thisIsAGlobalVariable
    function anon () {
    var thisIsALocalVariable
    thisIsAGlobalVariable = 5; //if you don't use the var prefix inside a fn, it becomes global
    }

    ReplyDelete
  9. You are finding it difficult because:


    javascript has another kind of syntax.
    javascript is dificult to debug
    javascript has no autocompletion like c# etc) ?or does it
    javascript has illogical rules (they become logical once you are known with them)
    everything can be done in 1000 ways, and when you search for a solution, you will find 2000 answers :) where c#, php mostly have a good practice function u "should/could" use


    However, I started using js/jquery a half year ago, with the same reasoning as you do, and I stuck to it, and now I use it daily to enhance my webapps.

    I just love it (especcially jquery). It is a life saver, I know what and where to look, I can do about anything with it.

    Everything seems logical.

    If I can give you one advice: javascript/jquery is a sour apple, but just hang in there, bit trough and you won't regret it.

    also, a loooot of people use it and are always willing to lend a hand if needed (I know I do)

    ReplyDelete
  10. Javascript is tricky. You don't have a compiler watching your back. To compensate, unit testing becomes more important. I've been doing my unit testing with jQuery/QUnit, but I recently started using Jasmine (http://github.com/pivotal/jasmine) and I recommend it 200%. Its a great testing framework.

    If you're not familiar with testing, or testing with javascript, I'd highly recommend finding unit tests for other OSS javascript projects (hopefully for code you could use) and seeing how they test it.

    With unit tests, you'll make the same mistakes, but catch them much sooner and with less grief. And if your tests are good, the mistakes won't come back after you fix tham.

    ReplyDelete
  11. I don't know how much UI design you have done in C, but the event variable only shows up when it is sent by the caller and the handler needs to, well, handle the object. If you do reading on event object, the confusion in q #2 should go away.

    There is no event handling in PHP, so I think you have not came across this issue in the past. JavaScript is a programming language with its own purpose, so it was designed to work for that specific purpose.

    ReplyDelete

Post a Comment

Popular posts from this blog

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex