代码之家  ›  专栏  ›  技术社区  ›  Cinn smfoote

获取位于同一对象中的函数的引用

  •  0
  • Cinn smfoote  · 技术社区  · 6 年前

    我不明白为什么下面的方法不起作用:

    var foo = { f1: () => 5, f2: this.f1() }
    

    我得到这个错误:

    类型错误:this.f1不是函数

    看来 this 引用全局范围而不是 foo .以下各项都可以正常工作:

    var foo = { f1: () => 5, f2() { return this.f1 } }
    

    有没有办法参考 f1 不把它包装成一个新函数?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Amadan    6 年前

    执行赋值的作用域是全局作用域,因此 this 不是 foo 是的。人们可能会认为这样可以解决问题:

    var foo = { f1: () => 5, f2: foo.f1() }
    

    但事实并非如此,因为在文本构造对象时,赋值并没有发生,而且 仍然 undefined 是的。

    你需要考虑到时间,并写下以下之一:

    var foo = { f1: () => 5 }
    foo.f2 = foo.f1
    

    var f = () => 5
    var foo = { f1: f, f2: f }
    

    当然,如果你想 f1 在运行时,如果不想显式调用带圆括号的函数,您仍然可以作为getter潜入函数:

    var foo = { f1: () => 5, get f2() { return foo.f1 } }
    foo.f2
    # => [Function: f1]
    
        2
  •  1
  •   OliverRadini    6 年前

    这个答案可能有帮助:

    How does the "this" keyword in Javascript act within an object literal?

    这个答案对箭头函数和常规函数之间的区别也有有用的注释,特别是如何 this 在以下各方面受到影响:

    Arrow functions vs Fat arrow functions

    var testOne = {
      a: 'hello',
      b: () => console.log(this.a)
    }
    
    var testTwo = {}
    
    testTwo.a = 'hello'
    testTwo.b = function() {console.log(this.a)}
    
    console.log(testOne.a)
    testOne.b()
    
    console.log(testTwo.a)
    testTwo.b()