确定匿名函数的属性名称

Determine the property name of an anonymous function

本文关键字:属性 函数      更新时间:2023-09-26

是否可以确定函数中匿名函数的属性名称? 例如。。。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Testing</title>  
        <script type="text/javascript">
            var $={};
            $.fn={};
            $.fn.somePropertyName = function() {
                console.log(this); // Object { somePropertyName=function()}
                //How do I get "somePropertyName" here?
            };
            $.fn.somePropertyName()
        </script>
    </head>
    <body></body> 
</html>

我的目的是在创建jQuery插件时不需要输入两次"myPluginName"。 不是我懒惰,而是不想有机会有所作为。

$.fn.myPluginName= function(method) {
    if (methods[method]) {
        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || ! method) {
        return methods.init.apply(this, arguments);
    } else {
        // Somehow get the property name "myPluginName" here.
        $.error('Method ' +  method + ' does not exist on jQuery.myPluginName');
    }    
};

您可以编写一个例程,该例程在对象上查找特定函数,并返回属性键:

function find_fn(obj, fn) {
  let (var i in obj) if (obj[i] === fn) return i;
}
function name(fn) {
  return find_fn($.fn, fn);
}

现在使用将函数绑定到自身的技巧,因此函数可以使用this从自身内部引用自身:

$.fn.foo = function() { console.log('my name is', name(this); }
$.fn.foo = $.fn.foo.bind($.fn.foo);
$.fn.foo();

但是,简单地执行以下操作可能更容易:

const FUNCNAME = 'somePropertyName';
$.fn[FUNCNAME] = function() {
  console.log("I am", FUNCNAME);
};

如果你现在输入错误 FUNCNAME,你会得到一个 ReferenceError 或其他东西。