JavaScript annotations

后端 未结 2 1244
醉酒成梦
醉酒成梦 2021-01-30 17:02

Are there JavaScript annotations?

Of course JavaScript doesn\'t have them, but are there additional libraries or proposed language extension, for exampl

2条回答
  •  一向
    一向 (楼主)
    2021-01-30 17:28

    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.

    Can I use these sort of annotations in my library?

    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
    });
    

提交回复
热议问题