状态机(有限状态交替变化)有限状态自动机,每运行一次 改变一次状态
什么是状态机?
以操作系统中的任务调度为例来说明什么是状态机。在操作系统的任务调度中经常见到状态机,其作用是根据任务的状态和当前资源条件来改变任务的状态。任务的状态和资源的条件就构成了一个状态机,参见下图:
- 普通状态机:要依赖于外部的变量,所以导致状态不安全
代码实现:
var flag=true;
function clock(){
if(flag){
console.log("开",flag)
}
else{
console.log("关",flag)
}
flag=!flag;
}
clock()
clock()
clock()
clock()
输出结果:
因为其状态机是通过外部变量flag的赋值才得以改变状态机的状态的,所以是依赖于外部的变量的,会导致状态的不安全,代码如下测试,加上改变状态的语句flag=true;,测试结果:
var flag=true;
function clock(){
if(flag){
console.log("开",flag)
}
else{
console.log("关",flag)
}
flag=!flag;
}
clock()
flag=true;
clock()
clock()
clock()
结果:
2.Generator 函数实现的状态机:
状态维护在generator函数内部,外部无法修改,状态是安全的
function* generator_clock(){
while(true){
console.log("开")
yield;
console.log("关")
yield;
}
}
var gclock=generator_clock();
gclock.next();
gclock.next();
gclock.next();
gclock.next();
结果:
tip:generator状态机是generator的一大作用,可以把Generator函数理解为一个状态机,他的内部封装了多个状态,当我们执行Generator函数时,他会返回一个迭代器对象,可以遍历他的内部状态
比如:
function* myGenerator(){
yield “hello”;
yield “world”
return “ending”
}
var mG=myGenerator()
console.log(mG.next())
console.log(mG.next())
console.log(mG.next())
console.log(mG.next())
结果:
{ value: ‘hello’, done: false }
{ value: ‘world’, done: false }
{ value: ‘ending’, done: true }
{ value: undefined, done: true }