在函数执行时有没有办法获取Function对象? 我正在为我的函数分配属性,并希望访问它们。 “这个”没有用。类似的东西:
a.b=function(){...code...};
a.b.c=100;
我想从函数中的代码访问a.b.c,而不知道自己的名字。 “这个”是指a。怎么能得到b?
我尝试将函数绑定到他自己的对象,但我不能。
谢谢。
我正在添加这个例子,我必须在几个不同的“theString”和“someSpecificValues”之后重复:
Object.defineProperty(theObject, theString, {get: function(...){...}.bind(theObject, someSpecificValues), configurable: true});
答案 0 :(得分:6)
您可以使用named function expression:
var a = {};
a.b = function myFunc() {
console.log(myFunc.c);
};
a.b.c = 100;
a.b();
它允许函数内部的代码访问函数本身,但不会将标识符添加到封闭范围。
修改:以下是一个更详细的示例,说明该函数中名称myFunc
仅存在:
var a = {};
a.b = function myFunc() {
console.log(myFunc.c);
};
a.b.c = 100;
a.d = function myFunc() {
console.log(myFunc.c);
};
a.d.c = 300;
a.b(); // logs 100
a.d(); // logs 300
console.log(typeof myFunc); // logs "undefined"
// create a myFunc variable
var myFunc = function() {
console.log("nooooooo!!!!");
};
a.b(); // STILL logs 100. the myFunc variable in this scope
// has no effect on the myFunc name that a.b uses
function callFunc(theFunc) {
theFunc();
}
callFunc(a.d); // STILL logs 300
// ===========================
function returnNamedFunction () {
return function myFunc() {
console.log(myFunc.c);
};
}
var iGotAFunction = returnNamedFunction();
iGotAFunction.c = 700;
iGotAFunction(); // logs 700
如果您不能使用命名函数表达式,例如当你使用.bind()
时,IIFE就足以满足大部分时间:
var myObj = {};
myObj.theFunc = (function () {
var f = function (arg1, arg2) {
console.log(this.theProp);
console.log(arg1);
console.log(arg2);
console.log(f.lista);
}.bind(myObj, "A!");
return f;
})();
myObj.theProp = "B!";
myObj.theFunc.lista = [1, 2, 3];
myObj.theFunc("C!");
答案 1 :(得分:1)
有两种获取当前功能的方法。
一个是arguments.callee
的“几乎弃用”用法。在函数体中,它总是引用此函数。
var a = {};
a.b = function () {
console.log(arguments.callee.c);
};
a.b.c = 100;
a.b();
在严格模式下禁止 arguments.callee
。 Reference
第二个使用named function expression作为JLRishe pointed。
arguments.callee
利弊优点:
bound
函数一起使用(arguments.callee
指的是绑定函数)new Function
缺点:
优点:
arguments.callee
缺点:
functionName
将引用原始函数,而不是绑定一个函数)new Function