为javascript添加函数说明函数

随着v8的推动,javascript增强的同时,交互模式也越来越重要。由于之前接触过python,对其中的__doc__功能颇有印象,因而决定在javascript中实现类似功能

功能:返回函数中没被变量赋值的字符串数组中的字符串,作为函数的文档。

原理:多亏了javascript的原型机制,在Function的prototype中添加一个__doc__()函数,这个函数通过toString得到函数代码,再利用正则表达式提取,返回出来需要显示的代码段。应为考虑到注释的影响,在开始首先会删掉注释,不过这也引来了一个问题:如果像是注释在字符串中依旧会被删除,不过注意下应该不是大问题。

使用方式:功能的使用很简单,首先在声明你自己的函数(假设是myFun)的时候在需要的地方加入["说明:","说明第一段","说明第二段"]可以加入多处,每一个字符串在输出时会输出一行。调用函数说明仅仅需要myFun.__doc__();就会返回说明字符串。很简单

考虑到javascript的语法,我觉得用一个不引用的字符列表比较好,毕竟不会影响到程序逻辑,对于性能影响也不大(发布前随便优化以下肯定没了),而且可以写的很好看。

Function.prototype.__doc__=function __doc__ (){
  "use strict";
  ["本函数用于查看自定义函数文档,返回文档中以[\"..文本内容..\"]中间包括的说明"];
  ["文档说明本质为一个在函数中未被引用的仅包含字符串的数组,且可以有多个数组",
   "数组中的每一个元素,即一个字符串,代表一行说明。函数通过调用__doc__方法",
   "返回这些在数组中的说明。",
   "  想更一步了解本功能,可以尝试分别运行Function.__doc__.__doc__()和",
   "  Function.__doc__.toString()比较其中内容。",
   "*注意:目前在文档存放数组中使用javascript注释标示会导致错误分割"
  ];
  arguments:null;
  name:"__doc__";
  var res="\n";
  if(typeof(this)==="function"){
    var getNoteReg=/(\/\/.*|\/\*.*?\*\/|\n|\r)/g;
    /*                 V下面没有这个空格,加上它是应为语法高亮的bug删掉这个空格就好         */
    var getList=/\S\s*\ [\s*("|')(\\.|.)*?\1\s*(,\s*"(\\.|.)*?"|,\s*'(\\.|.)*?')*\s*/g;
    var list=this.toString().replace(getNoteReg,"").match(getList);
    if(list==null)return "尚未编写文档";
    for(var i in list){
      var opt=list[i].substr(0,1);
      if(opt != "=" && opt!= ":"){
	try{
	  if(typeof(JSON)==="object" && typeof(JSON.parse)==="function"){
	    var date=JSON.parse(list[i].substr(1));
	  }else{
	    var date=eval(list[i].substr(1));
	  }for(var dateN in date)res+=date[dateN]+"\n";
	}catch(e){
	  if(typeof(console)!="undefined" && typeof(console.debug)==="function")
            console.debug(e);
	  else alert("error 解析失败");
	}
      }
    }return res;
  }else return "error type!not a function";
};

关于xu xc

工作两年了,有点懒,完了在写吧
此条目发表在javascript分类目录。将固定链接加入收藏夹。