【问题标题】:Accessing function object's properties from inside the function body从函数体内访问函数对象的属性
【发布时间】:2015-01-11 12:54:06
【问题描述】:

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

喜欢这个

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

【问题讨论】:

  • 嗯,您的示例使用了参考,因此您可以得到相应的答案。
  • 仍在寻找答案。想要一种从函数 f 的主体内部设置 f.a=3 的方法。以下是两次失败的尝试:function f() { f.a=3;这.a=3; } // f console.log(f.a);

标签: javascript function properties


【解决方案1】:

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

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

【讨论】:

  • 很好的答案!我相信这是最干净的方法。在 torazaburo 答案中,将函数绑定到自身会在使用 'this' 时丢失其父级的引用,如果函数没有标识符(即匿名函数),Christos 答案将不起作用
  • 算了,只有当你使用 arguments.callee 作为函数而不是作为获取属性的引用时才会出现问题,两者都不一样!例如:arguments.callee() 调用函数 f arguments.callee.a 只是从 f 中获取属性 'a'
  • 如果你使用arguments.callee作为一个函数,即arguments.callee(),'this'的值会和原来的调用不同,考虑这个函数:function f (recurse) { console.log('the value of this is: ', this); if (recurse) { arguments.callee(false); } } f(true);你会注意到this 的值在两个调用中是不同的!
  • 第一次调用时,值是'Window'对象,第二次,值是第一次调用的'arguments'对象,因为第二次调用函数 (通过 arguments.callee()) 您正在调用对位于 arguments 对象内的函数 f (callee) 的引用!
  • arguments.callee 在严格模式下被禁止,因为它会阻止某些类型的 VM 性能优化。请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 并致电f.a
【解决方案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】:

你可以用这个:

console.log(f.a);

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

【讨论】:

    【解决方案4】:

    Prototypes 就是你要找的东西。

    var F = function() {
        console.log(this.a);
    }
    
    F.prototype.a = 'Test';
    
    // instantiate new Object of class F
    new F();
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢,但我想问的是访问函数本身的属性而不是原型的属性
    【解决方案5】:

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

    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
    

    【讨论】:

      【解决方案6】:

      您可以使用 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();
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-16
          • 1970-01-01
          • 2012-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多