XDL_NO.2 指令式編程

指令式編程

培養指令式編程思維

復習上一節課的內容
  1. Markdown是一種輕量級的「標記語言」,使用它來書寫文檔、代碼規范,只要專心碼字就行,排版什么的它都幫你輕松搞定!好比,使用Markdown,項目經理再也不用擔心我的文檔了!
  2. 全棧工程師的概念,服務器、運行環境、數據庫、前端、后端、APP(這里我們注重的是Hybrid App) 直到上線,全部由一個人搞定!很牛叉吧,我會成為這樣的人才的!不要羨慕哥,努力、堅持的人總能吃到西瓜的!
  3. 編程語言的發展歷史,各種語言的優勢和劣勢,編程語言發展趨勢只會越來越簡單,方便人的操作,節省人力、腦力,讓機器去操作運行,喂,機器,快死去干活,你懂的!
  4. 編程語言執行的兩種方式:指令式編程、函數式編程;指令式編程,按照機器的運行規則來執行;函數式編程,就是讓電腦像人腦一樣的運行;你覺得那種好?這還要問,當然是兩種一起來,機器必須服務我的指令(不然像機器反主怎么辦,對吧!),但是在我讓它做某項事物的時候,我拋概念,機器你來執行,好比:我要賺一百萬,機器你來完成如何給我賺一百萬,我只要結果,過程你來!嘿嘿!
進入今天的內容
  1. 明確目標:培養人像電腦一樣思考!要玩轉它,首先你要懂它!
  2. 全棧開發中,Js的比重很大,適用于很多一面。
  3. 指令式編程,通過js來闡述它。

指令式編程

闡述之前,先擴展兩條Node命令

  • node -v 查看當前Node版本
  • node 進入交互模式
指令式編程最基本的指令
順序結構語句
順序結構

像 2+3、2*3、3-1,這種形式的都是計算機指令,<b>計算機指令不等于cpu指令</b>
而 a=3,a +=1、a *=1、a++,這帶有變量的指令,變量存儲在內存中
執行流程是從上而下的順序結構!


分支結構語句
if( true ) {

}else{

}

給予簡單的判斷,進入不同的結構

循環結構語句
  (初期循環結構應該是 goto 這種形式)
    a++;
    a:
    if( a > 10)  goto a;
    //當a>10條件滿足時,進入無限循環,想要跳出循環,兩種方法:
    // 1. 從滿足條件開始起一直到不滿足
    // 2.
    a:
    if( a > 50 ) goto b;
    goto a;
    b:

懶猿不想寫這么繁瑣的,所以因然而生,while 語句

var i = 100;       
while(i<100 ){
     i++;
}
//條件不滿足,跳出循環結構
var flag = true;
while(flag){
    break;//滿足條件的我就這么任性就是想這里跳出
}

懶猿還想再懶點,所以 for 又出現

       for(var i=0;i<100;i++){
                
       }
       //剖析
       var i = 0;
       for(;i<100;){//中間的是條件
             i++;
       }

指令式編程的最基本的指令就這三種了,執行流程也要遵循:

  1. 從上而下
  2. 根據條件
  3. 最后一個就是 在函數里
函數 執行流程
  var a=0;
  function f( ) {
     console.log(a); 
  }
  f();
  //當函數依次執行到  f() 函數時(存儲到了內存但并不執行),沒有被調用,不執行函數體,所以來到下面 函數 f() 被調用,返回到 函數執行函數體。 
 var a=0;
  function f( ) {
     console.log(a); 
     return 0;
  }
  var s = f();  
  // 函數體內有返回值,就會把返回值返回到調用處。也就是說 s等于0;

最基本的指令式編程的執行流程如上所述這樣了,那下面,就從計算機最基礎的指令開始,來強化理解計算機指令式編程,不斷加強!


以打印圖形來開始

打印圖形

這樣的重復勞動造輪子的工作還是讓給機器吧!
打印圖形

那想打印個矩形,怎么辦呢?



還是同樣的重復勞動,那我們是不是可以按照重復勞動的規律,寫個簡潔的.


打印矩形

那根據上述的循環,我是不是可以對他進行封裝,來控制矩形的長寬,想要什么樣的打印什么樣的。提取事物共同的特性,用一個抽象的概念來涵蓋!


打印矩形

抽象化后,封裝的函數達到了初期我想要的目標,那我是不是還可以對它進行抽象,畢竟我今天想用星,那我后天想用別的符號呢!所以繼續...


打印矩形

懶猿認為,好像并不是更方便了,反而有點復雜了!


打印矩形

這樣看是不是 舒服多了,也方便多了,也更容易讀懂了!那下面懶猿又要開始思考了,正方形也是矩形,對吧!只是長寬都一樣,那同理我的正方形是不是也可以打印出來了!


正方形

那通過上面這幾個實例,是不是更加對指令式編程又有新的了解了,好了,通過上邊幾個方法,我們是不是可以打印出我們想要的任何圖形,請看:
空心矩形

三角形

梯形

根據這些規律,我們是不是可以進行封裝,成為一個像上面輸出矩形函數一樣,等待更新!

打印空心矩形函數

規律:除了特殊的兩行,第一行和最后一行全星,中間的都是第一列和最后一列是星,中間是空格,這個規律知道了,我們是不是只要給個判斷,就會得到我們想要的,既然思路來了,就動手試驗試驗吧!


空心矩形
打印等邊三角形函數

規律: 看下圖我們來找找規律!


等邊三角形

那看到這,是不是有點明白了,每行輸出的星的個數和空格的個數都跟輸出的行數有關,根據下圖是不是明白輸出的原理了!從中我們也推算出每行星的輸出個數的方程式了:2n-1(n代表行)

第幾行 空格數 星個數 規律
1 9 1 1x2-1=1
2 8 3 2x2-1=3
3 7 5 3x2-1=5
4 6 7 4x2-1=7
5 5 9 5x2-1=9
6 4 11 6x2-1=11
7 3 13 7x2-1=13

當你不明白一個事物的時候,別急,怎么先找一個客觀存在的事物,找出他的共性,然后抽象它!
代碼:


三角形
打印梯形

規律: 三角形砍了頭,是不是就一個梯形了!那好根據這個我們用示例圖更直觀的看下:


梯形

那我一個上邊是5顆星,下邊是19顆星的 梯形;更據三角形規律方程式2n-1;我們是不是知道要輸出一個幾行的三角形,然后從第幾行砍掉頭!活生生的梯形不就展現在我們面前了!
代碼


梯形

輸出梯形
打印梯形

還是一樣,先找出規律:

空心三角形

這個實例圖看到時,是不是瞬間就得出,

  1. 第一個星和最后一個星打出,中間空格;也就最外邊打印
  2. 然后加上一個特殊行,最后一行全星就組成了一個空心三角!

那我們是不是可以更據這個兩個判斷,再加上輸出上述等別三角形的例子,是不是就可以打印出空心三角形了!

代碼


空心三角形

Javascript 的兩個不同的工作環境下的工作狀態

客服端

Javascript 中變量作用域的問題

  • 多人團隊項目開發中,存在最多的問題,命名空間污染問題,java當中有引入包名稱來解決,js當中可沒有引入類似包、命名空間這些,所以怎么解決呢!
熟悉js作用域
  <!DOCTYPE html>
  <html>
     <head>
         <meta charset="utf-8">
         <title>JS 中的作用域</title>
   </head>
    <script type="text/javascript">
      var = a; //這么低級的錯誤肯定不會犯的
      //var = a;
    </script>
     // 這是一個外部引入 js文件
    <script type="text/javascript">
      var = a; //這個文件也聲明了一個這樣的變量,那是不是就沖突了
    </script>
  <body>

  </body>
</html>

分析作用域

  <!DOCTYPE html>
  <html>
     <head>
         <meta charset="utf-8">
         <title>JS 中的作用域</title>
   </head>
    <script type="text/javascript">
           var a  = 5;//全局變量
           function f() {
              var a = 3;//這樣就不沖突了,這里的a 是局部變量
              alert(a);    //這里輸出的是函數內的a     
          }
          alert(a);//5
          f();// 3           
    ——————————————————————————————
           //var a  = 5;//全局變量 相當于 window.a (最頂層的a)=5;
           window.a = 5;
           function f() {
               var a = 3;
              // a = 3;//這樣 a ,在函數調用后,也是全局變量,根據js的特性,閉包函數,a 會一直往外(函數外)尋找!直到找到最頂層!
              alert(a);    //這里輸出的是函數內的a  
              window.a = 6;   
          }
          alert(a);//5
          f();// 3  
          alert(a);//6
    </script>
  <body>

  </body>
</html>       

網頁中的 js 全局變量是 window.a ,在node 環境下 是: global a ;這樣你對js中的作用域更深入的了解了吧!
參考文檔

我叫了,你不能叫!你叫了,我不能叫!

為了解決這個問題,經常用到這個方法!

  (function (){//匿名函數
       var  user;
       alert("a ");//會立即執行
  }) () ;

function f() {
  var a = function(){

   };
}

 function f() {
    return function () {//返回一個函數
            
     }
 }
 var x = f();//調用函數f(),返回一個函數,給了x;
 x();  //這樣 x() 可以調用函數了!

總結

  1. 了解最基本指令式編程里的最基本的指令,體會機器執行程序的流程,是自己更明白電腦執行流程!
  2. 了解js 在不同環境下的工作狀態,js的變量作用域問題,和一些解決辦法!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容