考虑以下代码:
class Foo {
private static temp: Number;
public static testIt() {
this.temp = 0;// Var 1
Foo.temp = 0;// Var 2
}
}
编译此类时,我没有从TS中得到任何错误。这是否意味着两个变体都可以引用静态变量?
答案 0 :(得分:3)
是的,尽管我不会使用第一个。
第一个起作用的原因是因为函数中的this
设置为点运算符之前的任何值。那是
Foo.testIt()
^^^ <- this will be Foo
从某种意义上来说,您希望this
是一个实例,但这种回旋方式令人困惑,但是这里没有实例。
总而言之,两者几乎总是相等的,但我仍然会在Foo
上使用this
。
答案 1 :(得分:2)
是的,两个版本都引用静态方法中的静态字段。静态方法this
内的对象是当前正在调用该方法的对象,该对象将是该类。
请注意,如果将静态方法分配给另一个变量,this
将不再引用该类(因为该方法不会在该类上调用)。不管如何调用该方法,名为access的类都将起作用。
class Foo {
private static temp: Number = 1;
public static testIt() {
console.log(this.temp)
console.log(Foo.temp)
}
}
Foo.testIt(); // Outputs 1, 1
let m = Foo.testIt;
m(); // Outputs undefined, 1
答案 2 :(得分:1)
TypeScript是一个超级集,用于验证您的代码类型在逻辑上是否一致(类型检查),它不验证您的代码是否是好的做法或它的用途。因此它将在此代码类型检查有效时进行编译。
那么这段代码是做什么的?
Foo.temp表示Foo类中的变量
this.temp表示Foo类实例中的变量。
答案 3 :(得分:1)
两种方法都是正确的
Foo.testIt()
时此将引用Foo
Foo
的变量(词法范围)的当前全局范围,并尝试将其属性temp更新为零通过这种方式this
指向另一个对象而不是Foo
Foo.testIt.call({}); => undefined , zero