javascript中的函数也是一个对象,可以具有属性。那么有没有办法从它自己的函数体内访问它的属性?
像这样var f = function() {
console.log(/*some way to access f.a*/);
};
f.a = 'Test';
f(); //should log 'Test' to console
答案 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
正是您要找的。 p>
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
,而有些人更喜欢区分每个范围。无论哪种方式都没问题。