如何从函数自己的实现中引用函数
How to reference a function from within its own implementation?
我正在开发一个由许多对象和函数(对象方法(组成的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 严格模式
这是一个非常黑客的方法:
(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
}
希望有帮助。
我认为你想做的事情(找到当前函数的名称(并不容易。您可能想考虑添加一个预处理步骤(就像在 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 和函数名称,则可以合理地保留。
myFunc : function _myFunc(){
alert(_myFunc); // function
}
命名函数并直接引用它们
要解决您的日志记录目的,请使用真正合理的唯一日志记录消息。如果需要行信息,则抛出异常。
相关文章:
- 如何在JavaScript中将字符串转换为函数引用
- IIFE中的函数引用不可用
- Wordpress中的Javascript出现匿名函数/引用错误
- 将函数引用存储在散列中在javascript中无法正常工作
- Google可视化addListener调用函数引用错误
- 如何存储包含参数的JS函数引用
- 如何从函数引用元素(从事件侦听器调用)
- 将函数引用传递给嵌套闭包
- Javascript递归函数引用了这一点
- 在Node.js中,从同一文件中的另一个函数引用一个函数会导致'ReferenceError:-函数-未定义
- 为什么将函数引用封装到匿名函数中可以更正'这'指向
- 如何在ES6中使用Arrow函数引用对象内部的其他函数
- 复制不带属性的函数引用
- 在控制器中使用具有函数引用的服务
- Jquery 和闭包或函数引用不起作用
- 将函数引用传递给函数失败
- Jasmine spyOn:当传递间谍函数引用时如何使其工作
- 从 Javascript 中的嵌套函数引用对象成员
- Typescript-不同文件中的模块函数引用-“;找不到符号“;
- 与许多事件侦听器和函数引用一个对象相比,什么是更好的方法