我无法弄清楚以下原因为何
var foo = { f1: () => 5, f2: this.f1() }
我收到此错误:
TypeError:this.f1不是函数
似乎this
是指全局范围而不是foo
。在以下情况下一切正常:
var foo = { f1: () => 5, f2() { return this.f1 } }
有没有一种方法可以引用f1
而不将其包装在新函数中?
答案 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()