Are there JavaScript annotations?
Of course JavaScript doesn\'t have them, but are there additional libraries or proposed language extension, for exampl
I know this is old. But ES2016 provides decorators (is it called decorators in Javascript). It is easy to make your own decorators, or you can extend my decorator module that let you easily wrap/inject your custom code.
https://github.com/cmartin81/decorator-wrap
Update: There now exists a proposal for proper decorators in JavaScript. It's currently stage 1 and you can use it in BabelJS and traceur.
Several libraries, like the mentioned before closure use annotations in comments, the closure compiler even asserts types as much as it can in compile time. However, these are not actual 'annotations' in the classical sense.
Unlike the 'obvious' answer - Yes, there are JavaScript annotations, some run-times support them.
For example
(function(){
"use strict";
//code in strict mode
})();
This will cause strict mode execution inside the function. More recently in Mozilla we've gotten:
(function(){
"use asm";
//code in asmjs
})();
Which will cause the code to run in asmjs mode, optimizing for transpiling.
Yes, while aspect oriented programming and annotations are widely uncommon in JS, it's perfectly possible to write a library that accepts a function, looks at its .toString
, figures out where such annotations end and executes the relevant code and then the rest of the function.
For example
an(function(){
"validate user"; // this could be something you implement yourself
"use strict";
})();
Creating a library that does this is pretty simple, it would require some nasty code (using a Function constructor and parsing the function as a string) but it's certainly possible. It's even debuggable in the new dev-tools and it's almost as fast as a native function.
Proposed syntax could be:
an.add("assertEmail",function(x){
if(!emailRegex.test(x){
throw new Error("Invalid call to function - expected email got",x);
}
});
// later on
an(function subscribeToNewsLetter(x){
"assertEmail";
var xhr = new XMLHttpRequest();
//send email
});