[乐意黎原创] JS获取当前执行函数体和正则表达式替换及代码格式化

1. 正则表达式替换使用的是replace()方法。

Replace()方法是用一些字符途欢另一些字符

语法:stringObject.replace(regexp,replacement)

regexp

必需。规定了要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。

replacement

必需。一个字符串值。规定了替换文本或生成替换文本的函数。

如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。

replacement 可以是字符串,也可以是函数。如果它是字符串,那么没有匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。举例:    

<script>
    //"5=a,6=b,7=c"换成"a=5,b=6,c=7"
    var str="5=a,6=b,7=c";
    str=str.replace(/(\d+)=(\w)/g,"$2=$1");
    console.log(str);
</script>                                                                                                                


var log = {
    info: function(arg){
        try {
            throw new Error();
        } catch (e) {
            document.querySelector("#stack").innerHTML = e.stack;
            var loc= e.stack.replace(/Error\n/).split(/\n/)[1].replace(/^\s+|\s+$/, "");
            document.querySelector("#loc").innerHTML = "Location: "+loc;
        }
    }
};

function foo(){
    log.info(123);
}

foo();

2. 返回函数本身:

function show_func(tmp){
        var init_code_str = tmp.replace(/var arg.*;/i,"");
        init_code_str = init_code_str.replace(/show.*;/i,"");
        console.log("------------show func output----------------");
        console.log(init_code_str);
}

function func_name(){
  show_func(arguments.callee.toString());
  var name = "aerchi";
  console.log("------------func_name output----------------");
  console.log(name);
}

func_name();


//输出如果如下:
09:29:17.320 VM5132:4 ------------show func output----------------
09:29:17.321 VM5132:5 function func_name(){ 
  var name = "aerchi";
  console.log("------------func_name output----------------");
  console.log(name);
}
09:29:17.321 VM5132:12 ------------func_name output----------------
09:29:17.322 VM5132:13 aerchi

3. 获取函数名称:

function fun_name (num){  
    var tmp = arguments.callee.toString();  
    var re = /function\s*(\w*)/ig;  
    var matches = re.exec(tmp); //正则原因只能获取一个,获取多个需循环获取 函数形式 function xxx()
    console.log("function name: "+matches[1]);  
      
}  
fun_name();  
09:39:03.256 VM293:5 function name: fun_name
09:39:03.276 undefined

 function getCallableName(callee){
        var regex = /function\s*(\w*)/i;
        return regex.exec(callee)[1];        
    }
     
    function show(callee){
        //1直接获取
        console.log("直接获取: "+callee.name);
        //2.正则表达式
         console.log("正则表达式: "+getCallableName(callee));
    }
     
    function main(){
        show(arguments.callee);
    }
     
  main();

//直接获取: main
//正则表达式: main

caller 属性

返回一个对函数的引用,该函数调用了当前函数。

functionName.caller

functionName 对象是所执行函数的名称。

说明

对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 JScript 程序的顶层调用的,那么 caller 包含的就是 null 。

如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。

下面的例子说明了 caller 属性的用法:

function CallLevel(){
   if (CallLevel.caller == null)
      return("CallLevel was called from the top level.");
   else
      return("CallLevel was called by another function.");

}






附:
JS代码格式工具,请参考:  http://tools.sharejs.com/jsdecoder.html


乐意黎

2018-03-22

本文地址: http://blog.csdn.net/aerchi/article/details/79649038

发布了430 篇原创文章 · 获赞 415 · 访问量 925万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览