1. 関数名を取得する 3 つの実装方法
例 1:
js の権威あるガイドに記載されているメソッド:
Function.prototype.getName = function(){
return this.name || this.toString().match(/functions*([^(]*)(/)[1]
}
例 2:
現在の関数が名前付き関数の場合は、その名前が返されます。匿名関数の場合は、割り当てられた関数変数名が返されます。クロージャ内の匿名関数の場合は、「anonymous」が返されます。
var getFnName = function(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 ];
}
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]; 関数、arguments.callee を 1 つのパラメータに渡します。function ee(){
//
var fnname =getFnName(arguments) .callee)
//
alert(fnname)
};
ee();
コードをコピー
コードは次のとおりです。
function getFuncName(_callee)
{ var _text = _callee.toString();
var _scriptArr = document.scripts; for (var i=0; i<_scriptarr.length i> {
var _start = _scriptArr[i ].text.indexOf(_text);
if (_start != -1)
return _text.match(/^functions*([^(] ). *rn/ )[1];
}
}
}
function a()
{
return getFuncName(arguments.callee);
}
var b = function ()
{
return getFuncName(arguments.callee);
}
window.alert(a());
window.alert(b());
上記の方法では解決できない別の状況があります。解決策を持っている人がアドバイスをいただければ幸いです。
コードをコピー
コードは次のとおりです。
var x =
{ run: function()
{
return getFuncName(arguments.callee); }
}
window.alert(x.run());関数を取得できません。
コードをコピーします
コードは次のとおりです:
関数テスト(){
for(var i=0;i
document.write(arguments[i]);
}
2. オブジェクトのすべての属性名と値を走査するメソッド