Work in pairs. Treat each code review as a structured dialogue, involving a series of questions and answers. If you do not understand a question or the answer, seek clarification before moving on.
Suggested questions
Are you using sensible names for all your variables? Is it obvious at first glance what each of them is being used for?
Are you polluting the global namespace unnecessarily with variables that could be put into functions or objects?
Are you declaring all your variable names at the top of the block in which they are used (this is particularly important in a language like JavaScript)?
Is your code DRY: Have you factored out your code or are you repeating yourself?
Are you keeping structure (HMTL), styling (CSS), data and bahaviour separate?
Is your code nicely commented?
Is your code consistently indented?
What feedback to you get from running jshint or some other code linting tool over your code?
See Airbnb JavaScript Style Guide for more ideas.
When defining a new function are we using sensible names? Is it obvious at first glance what the function is for?
What are the inputs for the function? And are these inputs reflected in the arguments?
Do you expect the function to have a return value and if so what do you expect it to be?
Are your functions short?
Are your functions easy to test?
As you work through the problem, are you working from the outsides in or are you trying to solve the problem in a linear sequence from top to bottom?
Are you writing tests for your functions?
What's a sensible first test for the function? Is this the simplest possible test that you can think of?
As you work through the problem, are all your passing tests still passing? If not, why not?
Are you checking for errors in callbacks?
Are you factoring out your nested code into separate functions? (i.e. trying to avoid callback hell)