我正在构建一个更大的对象,需要通过调试/检查值/结果/返回来更快,更具体。
现在我想到了以下内容:
var myObject = {
whatever: null,
whereever: null,
debug: false,
someFunction: function( arg ) {
// General - would output *all* logs for all object functions.
// if ( true === myObject.debug )
// console.log( 'FunctionNameHere', arg );
// More specific - would output *only* the log for the currently targeted function
if ( 'FunctionName' === myObject.debug )
console.log( 'FunctionNameHere', arg );
},
};
这样我就可以简单地将对象var debug
定义为一个函数名,只记录这部分。
唯一的问题是:我如何获得FunctionName
/ someFunction
?
旁注:
console.log( arguments.callee );
为我提供了整个功能来源。console.log( arguments.callee.name );
返回空。console.log( arguments.callee.toString() );
返回空console.log( arguments.caller );
返回undefined
如果我查看整个对象的日志,我会看到prototype.name="Empty"
等。所以没有机会直接从对象中获取它。
谢谢!
答案 0 :(得分:3)
如果要在debug
为true
并且debug
设置为函数名称时要记录每个函数,那么只记录您不需要硬编码的函数进入你的每一个功能。
您可以做的是动态重写该功能。这有点神奇,但它更灵活,你不需要在添加更多功能或更改名称时更改任何内容。
HERE 是工作代码。
for (var key in myObject) {
// if the keys belongs to object and it is a function
if (myObject.hasOwnProperty(key) && (typeof myObject[key] === 'function')) {
// overwrite this function
myObject[key] = (function() {
// save the previous function
var functionName = key, functionCode = myObject[functionName];
// return new function that will write log message and run the saved function
return function() {
if (myObject.debug === true || myObject.debug === functionName) {
console.log('I am function ' + functionName, ' with arguments: ', arguments);
}
functionCode(arguments);
};
})();
}
}
答案 1 :(得分:1)
这是一个匿名函数,它没有名称,因此你现在无法实现它。
如果你这样宣布:
someFunction: function iNowHaveAName( arg )
根据您所使用的浏览器,您可以通过不同的方式获取名称。
在支持它的浏览器中,您可以使用arguments.callee.name
。 (这是快速且性能明智的免费)
在没有的浏览器中,您可以捕获异常并在堆栈跟踪中找到它:
try {
i.dont.exist+=1;
}
catch(e) {
//play with the stacktrace here
}
这很慢且性能明显昂贵 - 请勿在生产代码中执行此操作:)
答案 2 :(得分:0)
如果某个功能没有名称,则无法获取该功能。一个匿名函数 - 这正是你所拥有的 - 没有名字。分配一个或多个变量或对象属性以引用函数值不会为其命名。
请考虑以下示例:
var a = [function(){}];
var b = a;
var c = a[0];
该单一功能的“名称”是什么? a[0]
? b[0]
? c
?为什么要选择一个呢?
JavaScript没有任何方法允许您请求对特定对象(包括函数)的所有引用。