英文:
Cannot read properties of undefined while testing if undefined (but it is defined)?
问题
console.log(this.variableInQuestion);
this.arrayOfObjects.each(function(thing) {
    if (this.variableInQuestion !== undefined && thing.property == this.variableInQuestion) {
        ...
    }
});
英文:
I have the following chunk of Typescript code in a function, with variableInQuestion = 0 being defined outside of the function:
console.log(this.variableInQuestion);
this.arrayOfObjects.each(function(thing) {
    if (this.variableInQuestion !== undefined && thing.property == this.variableInQuestion) {
        ...
    }
});
The problem is that the console.log line prints out exactly what I would expect (the default value of 0), but I get an error for the third line saying Cannot read properties of undefined (reading 'variableInQuestion') at [[[location of the first variableInQuestion in the third line]]].  I don't understand why it's giving me a "cannot read properties of undefined" error while I am testing to see if it's undefined.
EDIT: the .each thing is specific to the array of objects in question; that's not the issue.  If I run the following...
console.log(this.variableInQuestion);
this.arrayOfObjects.each(function(thing) {
    if (0 !== undefined && thing.property == 0) {
        ...
    }
});
It works exactly as I'd expect.
答案1
得分: 1
解决这个问题的方法如下:
variableInQuestion = 0;
myFunction() {
    let placeholder = this.variableInQuestion;
    this.arrayOfObjects.each(function(thing) {
        if (placeholder !== undefined && thing.property == placeholder) {
            ...
        }
    });
}
英文:
The way to address this problem is as follows:
variableInQuestion = 0;
myFunction() {
    let placeholder = this.variableInQuestion;
    this.arrayOfObjects.each(function(thing) {
        if (placeholder !== undefined && thing.property == placeholder) {
            ...
        }
    });
}
Special thanks to Pointy for identifying the problem!
答案2
得分: 0
如果你使用 console.log 输出你的数据,你会看到:
class X {
    variableInQuestion = 123;
    arrayOfObjects = [1, 2, 3];
    example() {
        console.log(this.variableInQuestion);
        this.arrayOfObjects.forEach(function (thing) {
            console.log({
                this: this,
                thing: thing,
            })
        })
    }
}
new X().example()
// 123
// { "this": undefined, thing: 1 }
// { "this": undefined, thing: 2 }
// { "this": undefined, thing: 3 }
因为 forEach 不保留 this 值。
要么使用 Lambda 表达式:
this.arrayOfObjects.forEach((thing) => { console.log(this) })
要么保留 this 值:
let that = this;
this.arrayOfObjects.forEach((thing) => { console.log(that) })
或者在 forEach 中提供 thisArg(不知道 .each,但 Array.prototype.forEach 支持这个):
this.arrayOfObjects.forEach(function(thing){ console.log(this) }, this)
英文:
If you console.log your data, you'll see
class X {
    variableInQuestion = 123;
    arrayOfObjects = [1, 2, 3];
    example() {
        console.log(this.variableInQuestion);
        this.arrayOfObjects.forEach(function (thing) {
            console.log({
                this: this,
                thing: thing,
            })
        })
    }
}
new X().example()
// 123
// { "this": undefined, thing: 1 }
// { "this": undefined, thing: 2 }
// { "this": undefined, thing: 3 }
because forEach doesn't keep this value.
Either use lambda
this.arrayOfObjects.forEach((thing) => { console.log(this) })
, keep this value
let that = this;
this.arrayOfObjects.forEach((thing) => { console.log(that) })
, or provide thisArg into forEach (dunno about .each but Array.prototype.forEach supports that)
this.arrayOfObjects.forEach(function(thing){ console.log(this) }, this)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论