Javascript 困惑于;这";in-arrow函数
我已经看过很多关于这个话题的讨论,也读过很多文章,但是我仍然不清楚这个在箭头函数中指的是什么 我似乎收到了与以下代码(简化)相关的运行时错误:Javascript 困惑于;这";in-arrow函数,javascript,angular,typescript,Javascript,Angular,Typescript,我已经看过很多关于这个话题的讨论,也读过很多文章,但是我仍然不清楚这个在箭头函数中指的是什么 我似乎收到了与以下代码(简化)相关的运行时错误: 导出类Foo实现OnInit{ myProp:string; myKeys:Array=[]; mySubKeys:Array=[]; @输入myObj; . . . 恩戈尼尼特(){ this.myKeys=Object.keys(this.myObj); this.myKeys.forEach((key)=>{ this.myProp=key; t
导出类Foo实现OnInit{
myProp:string;
myKeys:Array=[];
mySubKeys:Array=[];
@输入myObj;
. . .
恩戈尼尼特(){
this.myKeys=Object.keys(this.myObj);
this.myKeys.forEach((key)=>{
this.myProp=key;
this.mySubKeys=Object.keys(this.myObj[key]);
this.mysubkey.forEach((子键)=>{。
. . .
错误发生在this.myProp=key
处,调试器抱怨this
未定义
我的困惑是,对于arrow函数,我理解this
指的是调用arrow函数的作用域之前的this
。在这种情况下,前面的作用域不是类
作用域,因此不应该定义this.myProp
我尝试将箭头函数更改为forEach(function(key){…但出现了不同的错误
最后,如果arrow函数中的this
没有引用arrow函数中的类this
,那么如何引用类this
以及相关的类属性(例如myProp
)
arrow函数没有自己的this。使用封闭词法作用域的this值;arrow函数遵循普通变量查找规则。因此,在搜索当前作用域中不存在的this时,它们最终会从其封闭作用域中找到this
来自MDN:
arrow函数没有自己的this。使用封闭词法作用域的this值;arrow函数遵循普通变量查找规则。因此,在搜索当前作用域中不存在的this时,它们最终会从其封闭作用域中找到this
原因是函数中this
的值取决于函数的调用方式
在最基本的层次上,如果函数被称为this.myKeys.forEach()
,那么this
的值就是调用上下文,在这种情况下,调用上下文是myKeys
但是,在所有情况下,它不会是myKeys
,因此this.myProp&this.mySubKeys
不会返回值,而是返回未定义的值或引发错误
这种不稳定性在Javascript中是一个非常常见的问题,从早期开始就影响了它
在ES5
中,我们可以使用多种方法来稳定this
的值。一种常见的解决方案是将其分配给顶部的另一个变量,通常称为self
,然后始终在函数体中使用self
,如下所示:
ngOnInit() {
this.myKeys = Object.keys(this.myObj) {
let self = this; // declare the variable to refer class object
this.myKeys.forEach((key) => {
self.myProp = key;
self.mySubKeys = Object.keys(this.myObj[key]);
self.mySubKeys.forEach((subkey) => { . . .
. . .
希望这会有所帮助!原因是函数中的this
值取决于函数的调用方式
在最基本的层次上,如果函数被称为this.myKeys.forEach()
,那么this
的值就是调用上下文,在这种情况下,调用上下文是myKeys
但是,在所有情况下,它不会是myKeys
,因此this.myProp&this.mySubKeys
不会返回值,而是返回未定义的值或引发错误
这种不稳定性在Javascript中是一个非常常见的问题,从早期开始就影响了它
在ES5
中,我们可以使用多种方法来稳定this
的值。一种常见的解决方案是将其分配给顶部的另一个变量,通常称为self
,然后始终在函数体中使用self
,如下所示:
ngOnInit() {
this.myKeys = Object.keys(this.myObj) {
let self = this; // declare the variable to refer class object
this.myKeys.forEach((key) => {
self.myProp = key;
self.mySubKeys = Object.keys(this.myObj[key]);
self.mySubKeys.forEach((subkey) => { . . .
. . .
希望这会有所帮助!您公开的代码中的这个应该按照您的意愿工作。
我认为你的问题来自这一行:
this.myKeys = Object.keys(this.myObj) {
有一个开口{,当它应该是一个闭合的时候;
this.myKeys = Object.keys(this.myObj);
代码应该如下所示:
ngOnInit() {
this.myKeys = Object.keys(this.myObj);
this.myKeys.forEach((key) => {
this.myProp = key;
this.mySubKeys = Object.keys(this.myObj[key]);
编辑:
添加演示以尝试此正在运行:
请注意,Input()也必须有()。您公开的代码中的这个应该按照您的意愿工作。
我认为你的问题来自这一行:
this.myKeys = Object.keys(this.myObj) {
有一个开口{,当它应该是一个闭合的时候;
this.myKeys = Object.keys(this.myObj);
代码应该如下所示:
ngOnInit() {
this.myKeys = Object.keys(this.myObj);
this.myKeys.forEach((key) => {
this.myProp = key;
this.mySubKeys = Object.keys(this.myObj[key]);
编辑:
添加演示以尝试此正在运行:
请注意,输入()必须具有()也一样。可能重复的你能添加你正在接收的错误吗?可能重复的可能重复的可能重复的你能添加你正在接收的错误吗?可能重复的可能重复的可能重复的成功了!非常感谢!现在的问题是,为什么这样做有效?我以为箭头函数应该不起作用o从随附的上下文中看它的这个
,类应该是哪个
这个
,对吗?我已经更新了答案并解释了请检查谢谢你,帕拉姆。这非常有帮助。现在困扰我的最后一件事是另一张海报,chiril sarajiu,有一篇帖子(自从被删除后)这表明Stackblitz复制了我的代码,并表明没有问题。this
在他的forEach
块中运行良好,无需声明额外的self
变量。因此,现在我非常困惑。我开始认为Firefox调试器可能有问题?根据“如果在对象上调用函数,例如在obj.myMethod()或t中