【问题标题】:How to return name of the property an unnamed function is assigned to如何返回分配给未命名函数的属性名称
【发布时间】:2009-08-02 10:57:10
【问题描述】:

我得到以下代码:

function test () {

    this.testFunction = function () {
        //code to alert or return the string "testFunction"
    }

}
var testVar = new test();
testVar.testFunction();

有没有办法找出未命名函数分配给的属性的名称?我尝试与“调用者”和“被调用者”方法结合使用的任何方法都没有取得任何成功。

编辑: 我想检索属性名称的原因是将其用于调试消息,而我不必手动将属性名称传递给记录器。性能不是问题,因为这只是针对开发过程。

实际上,给函数命名的建议是个好主意……我想。除了必须输入两次函数名称之外,这是否有任何明显/众所周知的副作用? :-P

此外,这让我想到了在函数的开头添加注释,看起来像

/* $$NAME$$="testFunction" */

并且也可以解析 - 但是 JavaScript cmets 似乎在 FireFox 中被修剪(不像 IE),我更喜欢 FF 进行开发。使用“caller”/“callee”属性时,是否有办法在 FF 中也显示/使用 JS cmets?

【问题讨论】:

    标签: javascript reflection closures


    【解决方案1】:

    您可以循环浏览对象实例中可用的所有内容,例如

    function test() {
        this.testFunction = function () {
            for (var i in this) {
                if (this[i] === arguments.callee) {
                    alert(i); // alerts 'testFunction'
                }
            }
        }
    }
    var x = new test();
    x.testFunction();
    

    如果你的意图是递归调用函数,你可以简单地命名它

    this.testFunction = function inner() {
        inner();
    }
    

    【讨论】:

    • 感谢您的快速解答!我想检索属性名称的原因是将其用于调试消息,而我不必手动将属性名称传递给记录器。实际上,命名函数的建议是个好主意……我想。这有任何明显/众所周知的副作用吗? :-P 此外,这让我想到在函数的开头添加注释,该注释看起来像 /* $$NAME$$="testFunction" */ 并且也可以被解析 - 但 JS cmets 似乎是在 FF 中修剪(与 IE 不同),我更喜欢 FF 进行开发。
    • 我显然是这个董事会的新手。在原始帖子中添加其他信息是否很常见,还是可以在评论中发布?实际上,格式在评论中有点丢失......
    • 在编辑中添加附加信息非常好!这样,稍后到达的读者将从线程的开头知道您想要实现的目标。给每个函数命名的缺点是,你必须给它们命名两次。另一方面,循环遍历它的所有属性可能会稍微影响性能。如果您在生产环境中禁用它,它似乎是更好的选择。
    • 是的,性能并不重要,因为它不会停留在生产环境中,而只会用于开发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多