Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么是有限状态机?它的用途是什么?_Javascript_State Machine - Fatal编程技术网

Javascript 什么是有限状态机?它的用途是什么?

Javascript 什么是有限状态机?它的用途是什么?,javascript,state-machine,Javascript,State Machine,最近,我开始研究JavaScript中的有限状态机,我甚至认为这使它们更容易实现。虽然我认为我已经掌握了状态机用于跟踪和更改对象的“状态”(例如,“就绪”、“完成”、“不活动”等)的思想,但我认为我并不完全理解它们的实际含义。请有人帮我澄清一下: 究竟什么是有限状态机[或者它只是被称为状态机?我听说它是双向的] 有限状态机(JavaScript)有哪些实际用途 我什么时候不想使用有限状态机 哪些书籍、文章、教程等更深入地介绍了有限状态机(JavaScript) 有限状态机是一个抽象概念。因此,

最近,我开始研究JavaScript中的有限状态机,我甚至认为这使它们更容易实现。虽然我认为我已经掌握了状态机用于跟踪和更改对象的“状态”(例如,“就绪”、“完成”、“不活动”等)的思想,但我认为我并不完全理解它们的实际含义。请有人帮我澄清一下:

  • 究竟什么是有限状态机[或者它只是被称为状态机?我听说它是双向的]
  • 有限状态机(JavaScript)有哪些实际用途
  • 我什么时候不想使用有限状态机
  • 哪些书籍、文章、教程等更深入地介绍了有限状态机(JavaScript)

    • 有限状态机是一个抽象概念。因此,状态机的概念与任何特定语言都是正交的。如果你,它说“是一个用于设计计算机程序和时序逻辑电路的计算数学模型”

      这意味着FSM通常被用作数学概念,计算机科学家用它来解决诸如“xyz能被计算出来吗?”

      基于你的问题和你的链接,我想你的意思是询问状态图(或状态图),它是不同的。创建状态图时,您将程序划分为一系列状态,以及这些状态中可能发生的事件。例如,您的程序可能处于“编辑表单”状态,接收事件“doSave”,然后进入“保存”状态,接收事件“保存完成”,然后返回“查看”状态

      这种抽象非常有用,因为它允许程序员在概念上组织应该发生的事情,正确实现后,会产生更干净、更有组织的代码。这反过来又会导致更少的错误。状态图根据实现情况,只需处理偶数,就可以防止意外影响为状态定义的ts——例如,“查看”可能没有定义“保存”事件,因此,如果程序处于“查看”状态,则任何保存都没有意义,因为只有在“编辑”状态下才会发生


      如果您查看链接到的框架的概述,您会注意到有一组处理程序可用于钩住进入状态、离开状态、操作发生等。这允许您实际执行与状态/操作相对应的操作。例如,在进入“编辑“说明您可能向用户显示表单并启用“保存”按钮。进入“保存”状态时,您可能会禁用按钮并发出保存请求。收到“SaveComplete”事件后,您可能会转换到“查看”状态,删除表单,并显示其他内容。

      它通常用于语言分析器的扫描程序和词法分析器中。根据特定的语法规则创建并分析源代码中的每个标记

      基本上,这里检查当前状态,看看接下来的字符或标记是否有意义,以及它们应该如何组织

      什么是有限状态机

      这是一种声明事件以及在它们之间转换的副作用的方法

      有限状态机的一些实际用途是什么

      而不是像这样的代码:

      function decide()
      {
        if(mouseButtonIsDown && mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) {
          clearBuffers();
          startPlaying();
          cursorBecomeHand();
        }
        else if(!mouseButtonIsDown && !mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) {
      
      
        }
        // more ifs
      }
      
      您只保留几个状态,并将事件分解为函数,定义在哪个状态下发生的事情

      function drag_started() {
       switch(your_state) {
         case "within_box":
          clearBuffers();
          cursorBecomeHand();
          your_state= "playing";
          startPlaying();
          break;
       }
      
      }

      这导致了状态和事件的分离,这意味着更少的回归和更多的可维护性

      我什么时候不想使用有限状态机

      答案就在这一点上。如果你只有一个状态,不要用状态机

      哪些书籍、文章、教程等更深入地介绍了有限状态机(JavaScript)


      与学术界相反,我建议阅读jquery插件的源代码。例如,在维基百科中的_mouseMove和_mouseUp下查看?谷歌?顺便说一句,请注意JavaScript仅仅是一种脚本语言(即,它只定义核心API)。因此,实际使用取决于环境(web浏览器、web服务器、Win8),而不是语言本身。这就是为什么我提到我已经掌握了一个事实,即状态机用于跟踪应用程序中的“状态”,但我很难理解这一点的实际含义,我希望有人能够澄清。可能是多步骤表单?顺便问一下JS库的作者(在文章下面有一个论文部分)
      :)
      他应该能给你几个例子。一个更高级、开源的JavaScript库,用于编码分层状态机(UML状态图),可以在啊,是的,很好的例子。因此状态机通过跟踪应用程序正在做什么(“查看”页面)来管理“状态”然后要么对触发的事件执行操作,要么忽略触发的事件(用JavaScript术语)?这听起来很像控制器(MVC)或事件总线,非常相似。在我使用的实现中,您通过调用状态图上的事件在应用程序中移动,因此它不会真正跟踪——这是程序控制的入口点。正如我一直在研究和使用客户端应用程序中的单向数据流,包括Flux,尤其是Redux,我已经开始理解Redux确实帮助您使用确定性有限状态机来处理UI状态。在Redux中,引发的事件表示为动作,而纯函数的reducer函数类似于转换函数,它接受当前状态和引发的事件/动作的输入,并创建一个新状态,从而将UI转换到下一个状态。此外,在我看来,Redux似乎不仅仅是任何类型的FSM,但是一个确定性的FSM,意味着对于每一个动作和