2016-01-30 69 views
0

是否可以確定函數中的匿名函數的屬性名稱?例如...確定匿名函數的屬性名稱

<!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'); 
    }  
}; 
+0

你可以發佈你試圖用來解決問題的代碼片段嗎? – gnerkus

+0

可能重複[獲取匿名函數名稱](http://stackoverflow.com/questions/14178305/get-anonymous-function-name) – gnerkus

回答

0

您可以編寫認定對象上的特定功能的程序,並返回屬性鍵:

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或其他東西。

+0

感謝torazburo,所以,唯一的辦法是定義一個常量? – user1032531

+0

是'find_fn()'有效嗎?我得到一個語法錯誤'SyntaxError:expected expression,got keyword'var'let(var i in obj)if(obj [i] === fn)return i;' – user1032531