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

时间:2018-07-13 11:54:55

标签: javascript scope

我无法弄清楚以下原因为何

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

我收到此错误:

  

TypeError:this.f1不是函数

似乎this是指全局范围而不是foo。在以下情况下一切正常:

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

有没有一种方法可以引用f1而不将其包装在新函数中?

2 个答案:

答案 0 :(得分:2)

执行分配的作用域是全局作用域,因此this不是foo。有人可能会认为这样可以解决它:

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

但这不是-因为在文字构造对象时,赋值尚未发生,并且foo仍然是undefined

您需要考虑时间安排,并编写以下内容之一:

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

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

当然,如果您只想在运行时解析为f1,并且不想显式调用带括号的函数,则仍然可以将函数作为吸气剂使用:

var foo = { f1: () => 5, get f2() { return foo.f1 } }
foo.f2
# => [Function: f1]

答案 1 :(得分:1)

此答案可能会有所帮助:

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()