As discussed in the comments - obfuscation in an interpreted language is pretty much impossible. This is by virtue of the fact that the browser needs to be able to read your code as valid JavaScript to be able to run it - if the browser can do it, so can a sufficiently determined human! Any services that claim to be able to obfuscate JavaScript are simply offering 'security through obscurity' - i.e, making it more time-consuming to decode or less easy to understand.
For example, I took a look at the site you linked in your question. Here's my input code:
console.log("test");
And here's the output:
var _0xdef6=["\x74\x65\x73\x74","\x6C\x6F\x67"];console[_0xdef6[1]](_0xdef6[0])
This looks pretty secure at first glance, and it might be enough to scare off some less dedicated reverse-engineers. However, it's actually pretty simple to decode:
// t e s t l o g
var values = ["\x74\x65\x73\x74", "\x6C\x6F\x67"];
console[values[1]](values[0]);
Suddenly, it's all pretty obvious - the tool has taken the values and identifiers from the input code, converted them to ASCII hex codes, and stored them as strings in an array.
Now, admittedly a real program would be much longer than this, and would probably be harder to decode, but my point remains the same - if I can figure out how their obfuscator works for a small program over my lunch break, it's hardly going to protect your code from any serious reverse-engineering attempt!