我正在开发一个由许多对象和函数(对象方法)组成的javascript应用程序。我希望能够在应用程序的生命周期中记录许多事件。我的问题是在记录器内部我想知道哪个函数调用了日志条目,所以我可以将这些数据与日志消息一起保存。这意味着每个函数都需要能够以某种方式引用自身,因此我可以将该引用传递给记录器。
我正在使用javascript严格模式,因此不允许在函数内部使用arguments.callee
。
这是一个可以运行的非常简化的代码示例。我只是在这里使用alert
而不是我的记录器。
(function(){
"use strict";
window.myObject = {
id : 'myObject',
myFunc : function(){
alert(this.id); // myObject
alert(this.myFunc.id); // myFunc - I don't want to do this. I want something generic for all functions under any object
alert('???') // myFunc
alert(arguments.callee.id); // Will throw an error because arguments.callee in not allowed in strict mode
}
}
myObject.myFunc.id = 'myFunc';
myObject.myFunc();
})();
this
与myObject
相关,而不是myFunc
"use stict";
,那就行了。我想保持严格的模式,因为它提供了更好的性能,并构成了良好的编码实践。任何意见都将受到赞赏。
如果您不熟悉“严格模式”,这是一个很好的读取它的地方: JavaScript Strict Mode
答案 0 :(得分:4)
这是一种非常黑客的方式:
(function(){
"use strict";
window.myObject = {
id: 'myObject',
myFunc: function () {
// need this if to circumvent 'use strict' since funcId doesn't exist yet
if (typeof funcId != 'undefined')
alert(funcId);
},
myFunc2: function () {
// need this if to circumvent 'use strict' since funcId doesn't exist yet
if (typeof funcId != 'undefined')
alert(funcId);
}
}
// We're going to programatically find the name of each function and 'inject' that name
// as the variable 'funcId' into each function by re-writing that function in a wrapper
for (var i in window.myObject) {
var func = window.myObject[i];
if (typeof func === 'function') {
window.myObject[i] = Function('var funcId = "' + i + '"; return (' + window.myObject[i] + ')()');
}
}
window.myObject.myFunc();
window.myObject.myFunc2();
})();
基本上,我们通过在找到函数名称后重新编译字符串中的每个函数来绕过'use strict'声明。为此,我们在每个函数周围创建一个包装器,声明一个字符串变量'funcId'等于我们的目标函数的名称,这样变量现在通过闭包暴露给函数。
呃,不是最好的做事方式,但它有效。 或者,您只需从内部调用非严格函数:
(function(){
"use strict";
window.myObject = {
id: 'myObject',
myFunc: function () {
alert(getFuncName())
},
myFunc2: function () {
alert(getFuncName());
}
}
})();
// non-strict function here
function getFuncName(){
return arguments.callee.caller.id; // Just fyi, IE doesn't have id var I think...so you gotta parse toString or something
}
希望有所帮助。
答案 1 :(得分:0)
myFunc : function _myFunc(){
alert(_myFunc); // function
}
命名您的函数并直接引用它们
要解决您的日志记录目的,请使用真正合理的唯一日志消息。如果你想要行信息,那么抛出异常。
答案 2 :(得分:0)
我不认为你想做什么(找到当前功能的名称)很容易做到。你可能想要考虑添加一个预处理步骤(就像在C中用__line__
之类的东西一样),但也许只需要一点OO / currying魔术就可以了:
function logger(id){ return function(msg){
return console.log(id, msg);
};}
window.myObject = {
id : 'myObject',
myFunc : function(){
var log = logger('myFunc');
log(1); //prints "Myfunc, 1"
log(2); //prints "Myfunc, 2"
}
};
这是一种警察,但非常简单,如果你只记得保持id和函数名称的合理性,那么可以合理地保持这种能力。