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

Accessing function object's properties from inside the function body

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

像这样

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

你可以使用这个:

console.log(f.a);

如果 f 被执行,f(),在 f.a = 'Test'; 之前,您将在控制台中得到 undefined,因为没有任何 属性 name/key a 进行定义。 f.a = 'Test';执行后,name/keya会定义在f上,对应的值为'Test'。因此,稍后在函数 f 上执行时,值 'Test' 将是控制台的输出。

Prototypes 就是您要找的。

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

F.prototype.a = 'Test';

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

希望对您有所帮助!

这样做的经典方法是将函数绑定到自身,之后它可以通过 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

您可以使用 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,而有些人则喜欢区分每个作用域。哪种方式都可以。

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

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

下面是如何实现静态变量,将函数本身用作对象:

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

您可以使用 JavaScript 闭包;

https://www.w3schools.com/js/js_function_closures.asp

const add = (function () {
  let counter = 0;
  return function () {counter += 1; return counter}
})();

add();
add();
add();