我知道我们可以在类中声明静态变量或函数 像这样
class SomeClass(){
static foo = 1;
static fooBar(){
return ++SomeClass.foo;
}
}
有没有办法在函数内部直接声明静态局部变量?
class SomeClass(){
fooBar(){
static foo = 1;
return ++this.foo;
}
}
答案 0 :(得分:9)
这是不可能的。您可以在类中声明静态,但不能在函数体中声明。
答案 1 :(得分:5)
有没有办法直接在函数内声明静态局部变量
没有特殊的语法。但是如果你想要一个有状态函数,这里可以看到这个模式:https://github.com/basarat/typescript-book/blob/master/docs/tips/statefulFunctions.md
对于你的例子:
echo $this->Html->link('View Page', array(
'controller' => 'page',
'action' => 'view',
'?' => array('Search.brand_id' => 1, 'Search.shop_id' => 1))
);
答案 2 :(得分:1)
我认为@basarat的答案有问题。添加此内容:
let bar = new SomeClass();
console.log(bar.fooBar());
结果为1
,因为fooBar
不是方法,而是一个恰好是函数的字段。因此,SomeClass
的每个实例都有自己的fooBar
闭包,并有自己独特的foo
。
我认为要像在C ++中那样真正模拟静态局部变量,答案应该是3,因为所有实例都共享一个方法和一个foo
。要在Typescript中执行此操作,您可以在类的其余部分后之后定义fooBar
:
SomeClass.prototype.fooBar = (function() {
let foo = 1;
function fooBar() {
return foo++;
}
return fooBar;
})();
我还使用了不同的习惯用法来创建闭包,从而避免引入新类并且不使用箭头符号。万一fooBar曾经需要访问实例的成员,那么this
所指的东西就不会造成任何混乱。
如果有必要,我想您也可以在类主体中包含fooBar()
的虚拟定义,以进行类型检查;随后的外部定义应该简单地覆盖它。
答案 3 :(得分:1)
通过改进@realh的答案,我能够在类中解决所有问题:
SomeClass {
...
fooBar = (function () {
let foo = 1;
function fooBar(this: SomeClass) {
return foo++;
}
return fooBar;
})();
此参数是访问类字段的关键部分。