如何在函数体中获取Function对象?

时间:2015-01-16 11:49:43

标签: javascript

在函数执行时有没有办法获取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});

2 个答案:

答案 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.calleeReference

第二个使用named function expression作为JLRishe pointed

arguments.callee利弊

优点:

  • 可以安全地与bound函数一起使用(arguments.callee指的是绑定函数)
  • 它可以与使用new Function
  • 创建的功能一起使用

缺点:

  • 由于禁用了某些优化,它可能会降低您的程序速度
  • 它被认为几乎已弃用
  • 不能在严格模式下使用

命名函数表达式的优缺点

优点:

  • arguments.callee
  • 更容易理解它是如何运作的

缺点:

  • 使用绑定函数不会按预期工作(functionName将引用原始函数,而不是绑定一个函数)
  • 它不能用于使用new Function
  • 创建的函数