当我在函数内部定义变量时,不能在外部使用它。
我试图在NgOnInit
内定义一个变量,但它也不起作用。
我的代码:
addLink() {
if(
this.product.name !== '' &&
this.product.price !== 0 &&
this.product.instaURL !== '') {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
let uid = user.uid;
console.log(uid) //THIS WORK
}
});
console.log(uid); //THIS DONT WORK
this.productService.addProduct(this.product);
this.product = {} as Product;
}
}
我得到的错误:
TS2304:找不到名称'uid'。
答案 0 :(得分:0)
这是因为声明为df_before_target = df.truncate(before=target_date)
df_after_target = df.truncate(after=target_date)
len_b4 = len(df_before_target ) - 1 # substracting 1 to account for double counting of target_date in the truncated dfs.
len_a4 = len(df_after_target )
df.insert(0, 'day', range(-len_b4, -len_a4 + len(df)))
的变量的范围受到它们定义的块的限制,要使用它,您只需在函数范围之外声明它即可。
let
}
答案 1 :(得分:0)
上面的代码可以正常工作。函数内部带有“ let”只是暂时的。而是在声明类后立即创建变量:
export class FooBatComponent implements OnInit {
uid: number;
...
addLink() {
if(
this.product.name !== '' &&
this.product.price !== 0 &&
this.product.instaURL !== '') {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
this.uid = user.uid;
console.log(this.uid)
}
});
this.productService.addProduct(this.product);
this.product = {} as Product;
}
}
答案 2 :(得分:0)
这是因为uid
是一个块范围变量。您可以从here了解有关变量作用域的更多信息。另外,您可以在代码中进行以下更改,以使uid
条件之外的if
addLink() {
let uid;
if(this.product.name !== '' && this.product.price !== 0 && this.product.instaURL !== '') {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
uid = user.uid;
console.log(uid) //THIS WORK
}
});
console.log(uid); //THIS WILL WORK TOO
this.productService.addProduct(this.product);
this.product = {} as Product;
}
}
答案 3 :(得分:0)
首先需要了解作用域的内容,每当在一个成为块级作用域且仅在该块内可用的块中声明let的变量时,在更高级别的作用域中定义事物以使用该变量。
答案 4 :(得分:0)
这是一个功能范围问题。您必须在回调函数之外声明let uid
。
而且,您需要使用arrow function或使用bind将其保留在函数上下文中,以防止发生Cannot set property 'uid' of undefined TypeError: Cannot set property 'uid' of undefined
错误。
firebase.auth().onAuthStateChanged(user => {
if (user) {
this.uid = user.uid;
console.log(this.uid)
}
});
OR
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
this.uid = user.uid;
console.log(this.uid)
}
}.bind(this));
有关mdn doc的更多信息:
let允许您声明仅限于语句块或使用它的表达式范围的变量
export class FooBatComponent implements OnInit {
uid: number;
...
addLink() {
if (this.product.name !== '' &&
this.product.price !== 0 &&
this.product.instaURL !== '') {
firebase.auth().onAuthStateChanged(user => {
if (user) {
this.uid = user.uid;
console.log(this.uid)
}
});
console.log(this.uid);
this.productService.addProduct(this.product);
this.product = {} as Product;
}
}