callee的复杂用法

callee的复杂用法

CSS

/*
清晰网
kixi.com.cn
从javascript开始
*/

JavaScript

var getFnName = function (callee) {
    
    //把callee字符串化并且去掉空格回车等
    var _callee = callee.toString().replace(/[\s\?]*/g, ""),
        comb = _callee.length >= 50 ? 50 : _callee.length;        
    _callee = _callee.substring(0, comb);
    
    //通过正则截取调用函数的函数名称
    var name = _callee.match(/^function([^\(]+?)\(/);     
    if (name && name[1]) {
        return name[1];
    }
    
    //caller的用法,请参考一下
    var caller = callee.caller,
        _caller = caller.toString().replace(/[\s\?]*/g, "");
    var last = _caller.indexOf(_callee),
        str = _caller.substring(last - 30, last);
    name = str.match(/var([^\=]+?)\=/);
    if (name && name[1]) {
        return name[1];
    }
    return "anonymous"
};



//有名函数(函数定义)
function hasname() {
    var aa = getFnName(arguments.callee)
    //+++++++++++++++++++++++++++++++++
    alert(aa)
}

function kkk(){
    hasname();
}
kkk();


//匿名函数(函数表达式)
var noname = function () {
    //+++++++++++++++++++++++++++++++++
    var bb = getFnName(arguments.callee)
    //+++++++++++++++++++++++++++++++++
    alert(bb)
};
noname();


//闭包
(function () {
    //+++++++++++++++++++++++++++++++++
    var cc = getFnName(arguments.callee)
    //+++++++++++++++++++++++++++++++++
    alert(cc)
})();