Actually there are more than two tools, but Scala.js and JScala are indeed the 2 tools still under active development.
The difference is fundamental: Scala.js is a compiler from Scala to JavaScript, whereas JScala is a macro-based DSL for generating snippets of JavaScript code.
As @Gaurav explained in his answer, Scala.js is the regular Scala compiler, but it emits JavaScript code instead of JVM bytecode. The Scala code you write is never run by a JVM. All your Scala code is translated to JavaScript. For that reason, it supports the entire Scala language, including, e.g., the collections library. This is useful to write the entire client-side as a Scala application.
Using JScala, on the other hand, most of your app (at least everything outside calls to the javascript
macro) is still run on a JVM. The macro rewrites the Scala-looking code inside it to the corresponding JavaScript AST (or directly as a code string). Which means that when the JVM executes the code there, the program generates (at runtime) a JavaScript AST/string. This is useful to generate snippets of code to be sent to the client dynamically.
The main decision criterium is thus:
- If you want to write the client-side of your Web app as a Scala application, use Scala.js
- If you want to generate snippets of JavaScript code from the server side written in Scala, use JScala
A more elaborate comparison of these two tools is available at http://www.sebnozzi.com/84/scala-to-javascript-comparison/