从函数体内部访问函数对象的属性

时间:2015-01-11 12:54:07

标签: javascript function properties

javascript中的函数也是一个对象,可以具有属性。那么有没有办法从它自己的函数体内访问它的属性?

像这样

var f = function() { 
  console.log(/*some way to access f.a*/);
};
f.a = 'Test';
f(); //should log 'Test' to console

6 个答案:

答案 0 :(得分:3)

arguments.callee是函数本身,并不受函数名称的影响。

var f = function() { 
  console.log(arguments.callee.a);
};
f.a = 'Test';
f();

答案 1 :(得分:2)

你可以使用它:

console.log(f.a);

如果f执行f()f.a = 'Test';之前,您将在控制台中获得undefined,因为没有任何名称/密钥a {1}}被定义。执行f.a = 'Test';后,将在f上定义名称/密钥a,相应的值将为'Test'。因此,稍后在函数f上执行,值'Test'将是控制台的输出。

答案 2 :(得分:2)

这样做的经典方法是将函数绑定到自身,之后它可以通过this访问自己的属性:



 var f = function() { 
   console.log(this.a);    // USE "THIS" TO ACCESS PROPERTY
 };

 f.a = 'Test';
 f = f.bind(f);            // BIND TO SELF

 f();                      // WILL LOG 'Test' TO CONSOLE




答案 3 :(得分:0)

Prototypes正是您要找的。

var F = function() {
    console.log(this.a);
}

F.prototype.a = 'Test';

// instantiate new Object of class F
new F();

希望这有帮助!

答案 4 :(得分:0)

这里是如何实现一个静态变量,使用函数本身作为一个对象:

function f()
    {
    if (!f.staticObj)
        f.staticObj={a:3};
    return f.staticObj;
    } // f
console.log(f().a); // Assigns the var
console.log(f().a); // Returns the var

答案 5 :(得分:-1)

您可以使用IIFE进行设置:

var f = (function () {
  function f () {
    console.log(f.a);
  }
  f.a = 'Test';
  return f;
})();

f() // logs 'Test'
f.a === 'Test' // true

请注意,您不必使用f(甚至是函数声明)才能正常工作:

var f = (function () {
  var _f = function () {
    console.log(_f.a);
  };
  _f.a = 'Test'
  return _f;
});

f() // logs 'Test'
f.a === 'Test' // true

有些人喜欢在整个过程中使用相同的变量来强调内部f最终将成为外部f,而有些人更喜欢区分每个范围。无论哪种方式都没问题。