Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲免费观看视频,**毛片免费观看,亚洲国产精品久久人人爱

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線:

          51單片機(jī)進(jìn)階,處于瓶頸的你必看

          51單片機(jī)進(jìn)階,處于瓶頸的你必看

          :最小系統(tǒng)能夠運(yùn)行起來(lái)的必要條件。

          1.電源 2.晶振3.復(fù)位電路

          二:對(duì)單片機(jī)任意IO口的隨意操作

          1.輸出控制電平高低2.輸出檢測(cè)電平高低。

          三:?jiǎn)纹瑱C(jī)特殊功能應(yīng)用

          1: 定時(shí)器:重點(diǎn)掌握最常用的方式2

          2: 中斷:外部中斷、定時(shí)器中斷、串口中斷

          3: 串口通信:?jiǎn)纹瑱C(jī)之間、單片機(jī)與計(jì)算機(jī)間

          (在此不詳細(xì)介紹單片機(jī)C語(yǔ)言)

          一:最小系統(tǒng)運(yùn)行條件

          1.電源 2.晶振3.復(fù)位電路 詳細(xì)資料參見(jiàn)導(dǎo)論中的最小系統(tǒng)電路圖

          二:普通I/O口的操作

          1:輸出高低電平 output

          操作:用程序給輸出寄存器P0/P1/P2/P3賦值,1/0實(shí)現(xiàn)高低電平的控制

          應(yīng)用:這種高低可實(shí)現(xiàn)一些對(duì)外部設(shè)備的控制,比如led,lcd····,也可加上電流驅(qū)動(dòng)或繼電器或可控硅等器件實(shí)現(xiàn)對(duì)大型用電器的控制

          實(shí)例:I/O操作最簡(jiǎn)單的實(shí)例就是流水燈,流水燈程序參見(jiàn):http://blog.csdn.net/metalseed/article/details/8196727

          2:檢測(cè)電平高低 input

          操作:先給寄存器P1/P2/P3賦值0xff,然后用 if 語(yǔ)句來(lái)進(jìn)行判斷

          應(yīng)用:可用來(lái)讀取外部外部信息實(shí)現(xiàn)模擬通信,獲得傳感器數(shù)據(jù),按鍵采集等

          實(shí)例:矩陣鍵盤(pán)的掃描代碼:http://blog.csdn.net/metalseed/article/details/8296590

          數(shù)碼管顯示:http://blog.csdn.net/metalseed/article/details/8537554

          PS: P0為三態(tài)(高電平,低電平,高阻態(tài)) P1,P2,P3為準(zhǔn)雙向IO口(內(nèi)部有上拉電阻,做輸入用時(shí),先寫(xiě)1)

          三:?jiǎn)纹瑱C(jī)特殊功能應(yīng)用

          這是進(jìn)階的核心內(nèi)容,單片機(jī)的特殊功能全部集中在P3口,這些引腳具有多功能,可通過(guò)寄存器配置(關(guān)于寄存器,日后補(bǔ)上詳細(xì)描述,寄存器理解屬于高階思想,在此先講操作)來(lái)確定啟用第幾功能。

          首先附上P3第二功能定義

          P3第二功能定義:

          P3.0:RXD串行口輸入

          P3.1:TXD串行口輸出

          P3.2:INT0外部中斷0輸入

          P3.3:INT1外部中斷1輸入

          P3.4:T0定時(shí)器0外部輸入

          P3.5:T1定時(shí)器1外部輸入

          P3.6:WR外部寫(xiě)控制

          P3.7:RD外部讀控制

          1: 中斷

          中斷的概念:

          中斷其實(shí)很容易理解,這樣來(lái)說(shuō)吧,比如說(shuō)你在做A事,但是突然間來(lái)了你想起來(lái)了更重要的B事,所以你馬上去做B事了,做完之后再回來(lái)繼續(xù)做A事,這個(gè)就是中斷!在程序里面也是一樣的!中斷系統(tǒng)里面有五個(gè)中斷,外部中斷0和1,定時(shí)器/計(jì)數(shù)器中斷0/1,串行口中斷!

          舉個(gè)例子你可能會(huì)容易懂點(diǎn),定時(shí)中斷:比如你定時(shí)1ms,主程序在運(yùn)行,每當(dāng)1ms時(shí)間到后,就跑到定時(shí)中斷子程序 里面執(zhí)行,執(zhí)行完后再回到主程序。。。中斷程序是1ms進(jìn)去一次

          后面中斷講解太過(guò)系統(tǒng),不易理解,日后補(bǔ)上簡(jiǎn)潔易懂的,請(qǐng)親見(jiàn)諒.....。。

          中斷data請(qǐng)移步至:http://wenku.baidu.com/view/4f3738f64693daef5ef73da6.html

          中斷實(shí)例:

          超聲波外部中斷 + 串口通信 將測(cè)出的距離通過(guò)串口發(fā)送

          http://blog.csdn.net/metalseed/article/details/8764348

          2: 定時(shí)器

          定時(shí)器簡(jiǎn)介

          定時(shí)器及計(jì)數(shù)器的應(yīng)用,比 I / O 功能稍微高級(jí)點(diǎn),可實(shí)現(xiàn)更為復(fù)雜的功能。

          顧名思義,定時(shí)器可實(shí)現(xiàn)延時(shí)操作,計(jì)數(shù)器則可實(shí)現(xiàn)計(jì)數(shù)功能(這兩者都靠中斷實(shí)現(xiàn))。

          兩者實(shí)質(zhì)上都是加一計(jì)數(shù)器(16位),由高8位和低8位兩個(gè)寄存器組成,當(dāng)所有位為1即定時(shí)器溢出時(shí),便觸發(fā)中斷。

          PS:51內(nèi)部有兩個(gè)定時(shí)器:定時(shí)器0,定時(shí)器1,定時(shí)模式加1的周期為一個(gè)機(jī)器周期 12M晶振的機(jī)器周期為1us

          應(yīng)用定時(shí)器,需要操作響應(yīng)的寄存器。

          主要涉及三個(gè): 1:中斷允許寄存器IE (可位尋址,所以能直接操作EA,ET0, ET1,)

          2:TMOD 是定時(shí)/計(jì)數(shù)的工作方式寄存器,確定工作方式和功能

          3:TCON是控制寄存器,控制T0,T1的啟動(dòng)和停止及設(shè)置溢出標(biāo)志。

          操作方法:

          step 1: 配置IE寄存器,讓定時(shí)器使能(使能即能被應(yīng)用,可假象為函數(shù)的聲明)。

          step 2: 配置TMOD寄存器,來(lái)確定定時(shí)器的工作方式,同時(shí)配置TH,TL寄存器來(lái)對(duì)定時(shí)器裝入初值

          step 3: 配置TCON寄存器,啟動(dòng)或停止定時(shí)器(因?yàn)槎〞r(shí)器一旦啟用,就不停加1,直到TH,TL所有位為1時(shí)溢出,跳入中斷函數(shù),所以在啟用前,要寫(xiě)好中斷函數(shù),中斷函數(shù)寫(xiě)法demo里有說(shuō)明)

          這里所說(shuō)的配置,即給寄存器賦值,例如: TMOD=0X0f;

          總而言之:要使用定時(shí)器或者計(jì)數(shù)器需要依次給如下寄存器賦值: IE,TOMD,TH,TL, TCON,具體要賦什么值,參加下面的寄存器位含義說(shuō)明;

          寄存器說(shuō)明及定時(shí)器工作方式:

          點(diǎn)擊打開(kāi)特殊功能寄存器詳細(xì)說(shuō)明

          代碼示例:

          1:最直白的定時(shí)器工作方式1演示,每隔50MS P0取反

          [java] view plain copy print?

          #include

          void main()

          {

          EA=ET0=1; /*step 1 : 中斷允許*/

          TMOD=0x01; /*step 2 : 模式配置*/

          TH0=(65536 - 50000) / 256; /*裝初值*/

          TL0=(65536 - 50000) % 256; /*裝初值*/

          TR0=1; /*step 3 : 啟動(dòng)*/

          while(1)

          {

          /*Hello World*/

          }

          }

          /*timer0為函數(shù)名,隨意寫(xiě),后面的interrupt X,X是相應(yīng)中斷的編號(hào),5個(gè)中斷源各有固定編號(hào)*/

          /*using x 表示占用ram中的X寄存器(0-3),C語(yǔ)言中IDE自動(dòng)分配不用寫(xiě) */

          void timer0() interrupt 1 using 1

          {

          /*重裝初值*/

          TH0=(65536-50000)/256;

          TL0=(65536-50000)%256;

          /*operation*/

          P0=~P0;

          }

          2:高級(jí)模板

          待補(bǔ)~

          3: 串口通信

          接口:RS232C

          RS-422A用于全雙工,而RS-485則用于半雙工(比232距離遠(yuǎn))

          需配置的寄存器 : SCON PCON IE

          SCON是一個(gè)特殊功能寄存器,用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志:

          SM0和SM1為工作方式選擇位,可選擇四種工作方式

          SM2,多機(jī)通信控制位,主要用于方式2和方式3。當(dāng)接收機(jī)的SM2=1時(shí)可以利用收到的RB8來(lái)控制是否激活RI(RB8=0時(shí)不激活RI,收到的信息丟棄;RB8=1時(shí)收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)。當(dāng)SM2=0時(shí),不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI(即此時(shí)RB8不具有控制RI激活的功能)。通過(guò)控制SM2,可以實(shí)現(xiàn)多機(jī)通信。

          在方式0時(shí),SM2必須是0。在方式1時(shí),若SM2=1,則只有接收到有效停止位時(shí),RI才置1。

          REN,允許串行接收位。由軟件置REN=1,則啟動(dòng)串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收。

          TB8,在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用。可以用作數(shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。

          在方式0和方式1中,該位未用。

          RB8,在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時(shí),若SM2=0,則RB8是接收到的停止位。

          TI,發(fā)送中斷標(biāo)志位。在方式0時(shí),當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行發(fā)送停止位的開(kāi)始時(shí),由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請(qǐng)。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請(qǐng)。

          RI,接收中斷標(biāo)志位。在方式0時(shí),當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請(qǐng)。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請(qǐng)。

          PCON中只有一位SMOD與串行口工作有關(guān):

          SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3時(shí),波特率與SMOD有關(guān),當(dāng)SMOD=1時(shí),波特率提高一倍。復(fù)位時(shí),SMOD=0。

          波特率的計(jì)算

          方式0的波特率=fosc/12

          方式2的波特率=(2SMOD/64)·fosc

          方式1的波特率=(2SMOD/32)·(T1溢出率)

          方式3的波特率=(2SMOD/32)·(T1溢出率)

          當(dāng)T1作為波特率發(fā)生器時(shí),最典型的用法是使T1工作在自動(dòng)再裝入的8位定時(shí)器方式(即方式2,且TCON的TR1=1,以啟動(dòng)定時(shí)器)。這時(shí)溢出率取決于TH1中的計(jì)數(shù)值。

          T1溢出率=fosc /{12×[256-(TH1)]}

          操作步驟:

          1:確定串口工作方式 (配置SCON 可位尋址)

          2:根據(jù)1確定的方式,看是否需要手動(dòng)設(shè)置波特率 (TMODE,TH TL)

          3:設(shè)置波特率后啟動(dòng)(REN, TR)

          4:如果使用中斷,開(kāi)中斷并寫(xiě)函數(shù)(EA=ES=1, void ser() interrupt 4 )

          串口通信模板:

          http://blog.csdn.net/metalseed/article/details/8579997

          點(diǎn)對(duì)點(diǎn)通信:

          多機(jī)通信:

          1、硬件連接

          單片機(jī)構(gòu)成的多機(jī)系統(tǒng)常采用總線型主從式結(jié)構(gòu)。所謂主從式,即在數(shù)個(gè)單片機(jī)中,有一個(gè)是主機(jī),其余的是從機(jī),從機(jī)要服從主機(jī)的調(diào)度、支配。80C51單片機(jī)的串行口方式2和方式3適于這種主從式的通信結(jié)構(gòu)。當(dāng)然采用不同的通信標(biāo)準(zhǔn)時(shí),還需進(jìn)行相應(yīng)的電平轉(zhuǎn)換,有時(shí)還要對(duì)信號(hào)進(jìn)行光電隔離。在實(shí)際的多機(jī)應(yīng)用系統(tǒng)中,常采用RS-485串行標(biāo)準(zhǔn)總線進(jìn)行數(shù)據(jù)傳輸。

          2、通信協(xié)議

          所有從機(jī)的SM2位置1,處于接收地址幀狀態(tài)。

          主機(jī)發(fā)送一地址幀,其中8位是地址,第9位為地址/數(shù)據(jù)的區(qū)分標(biāo)志,該位置1表示該幀為地址幀。

          所有從機(jī)收到地址幀后,都將接收的地址與本機(jī)的地址比較。對(duì)于地址相符的從機(jī),使自己的SM2位置0(以接收主機(jī)隨后發(fā)來(lái)的數(shù)據(jù)幀),并把本站地址發(fā)回主機(jī)作為應(yīng)答;對(duì)于地址不符的從機(jī),仍保持SM2=1,對(duì)主機(jī)隨后發(fā)來(lái)的數(shù)據(jù)幀不予理睬。

          從機(jī)發(fā)送數(shù)據(jù)結(jié)束后,要發(fā)送一幀校驗(yàn)和,并置第9位(TB8)為1,作為從機(jī)數(shù)據(jù)傳送結(jié)束的標(biāo)志。

          主機(jī)接收數(shù)據(jù)時(shí)先判斷數(shù)據(jù)接收標(biāo)志(RB8),若RB8=1,表示數(shù)據(jù)傳送結(jié)束,并比較此幀校驗(yàn)和,若正確則回送正確信號(hào)00H,此信號(hào)命令該從機(jī)復(fù)位(即重新等待地址幀);若校驗(yàn)和出錯(cuò),則發(fā)送0FFH,命令該從機(jī)重發(fā)數(shù)據(jù)。若接收幀的RB8=0,則存數(shù)據(jù)到緩沖區(qū),并準(zhǔn)備接收下幀信息。

          主機(jī)收到從機(jī)應(yīng)答地址后,確認(rèn)地址是否相符,如果地址不符,發(fā)復(fù)位信號(hào)(數(shù)據(jù)幀中TB8=1);如果地址相符,則清TB8,開(kāi)始發(fā)送數(shù)據(jù)。

          從機(jī)收到復(fù)位命令后回到監(jiān)聽(tīng)地址狀態(tài)(SM2=1)。否則開(kāi)始接收數(shù)據(jù)和命令。

          3、應(yīng)用程序

          主機(jī)發(fā)送的地址聯(lián)絡(luò)信號(hào)為:00H,01H,02H ,… …(即從機(jī)設(shè)備地址),地址FFH為命令各從機(jī)復(fù)位,即恢復(fù)SM2=1。

          主機(jī)命令編碼為:01H,主機(jī)命令從機(jī)接收數(shù)據(jù);02H,主機(jī)命令從機(jī)發(fā)送數(shù)據(jù)。其它都按02H對(duì)待。

          RRDY=1:表示從機(jī)準(zhǔn)備好接收。

          TRDY=1:表示從機(jī)準(zhǔn)備好發(fā)送。

          ERR=1: 表示從機(jī)接收的命令是非法的。

          程序分為主機(jī)程序和從機(jī)程序。約定一次傳遞數(shù)據(jù)為16個(gè)字節(jié),以01H地址的從機(jī)為例。

          寄存器數(shù)據(jù)手冊(cè):

          單片機(jī)細(xì)節(jié):

          定義的變量存儲(chǔ)在RAM中,對(duì)寄存器賦值時(shí),單片機(jī)內(nèi)部通過(guò)數(shù)據(jù)交換實(shí)現(xiàn)。

          復(fù)位時(shí) P0,P1,P2,P3寄存器全為0xff,其他各位0x00;

          avaScript Break 和 Continue

          • JS Loop While
          • JS 類(lèi)型轉(zhuǎn)換



          break 語(yǔ)句“跳出”循環(huán)。

          continue 語(yǔ)句“跳過(guò)”循環(huán)中的一個(gè)迭代。

          Break 語(yǔ)句

          在本教程稍早的章節(jié)中,您已見(jiàn)到了 break 語(yǔ)句。它被用于“跳出” switch 語(yǔ)句。

          break 語(yǔ)句也可用于跳出循環(huán)。

          break 語(yǔ)句會(huì)中斷循環(huán),并繼續(xù)執(zhí)行循環(huán)之后的代碼(如果有):

          實(shí)例

          for (i=0; i < 10; i++) {
              if (i===3) { break; }
              text +="數(shù)字是 " + i + "<br>";
          }
          

          親自試一試

          Continue 語(yǔ)句

          continue 語(yǔ)句中斷(循環(huán)中)的一個(gè)迭代,如果發(fā)生指定的條件。然后繼續(xù)循環(huán)中的下一個(gè)迭代。

          本例跳過(guò)值 3 :

          實(shí)例

          for (i=0; i < 10; i++) {
              if (i===3) { continue; }
              text +="數(shù)字是 " + i + "<br>";
          } 
          

          親自試一試

          JavaScript 標(biāo)簽

          如需標(biāo)記 JavaScript 語(yǔ)句,請(qǐng)將標(biāo)簽名和冒號(hào)置于語(yǔ)句之前:

          label:
          statements
          

          break 和 continue 語(yǔ)句是僅有的可“跳出”代碼塊的 JavaScript 語(yǔ)句。

          語(yǔ)法:

          break labelname;
          
          continue labelname;
          

          continue 語(yǔ)句(不論有無(wú)標(biāo)簽引用)只能用于跳過(guò)一個(gè)迭代。

          break 語(yǔ)句,如果沒(méi)有標(biāo)簽引用,只能用于跳出一個(gè)循環(huán)或一個(gè) switch。

          如果有標(biāo)簽引用,則 break 語(yǔ)句可用于跳出任意代碼塊:

          實(shí)例

          var  cars=["BMW", "Volvo", "Saab", "Ford"];
          list: {
              text +=cars[0] + "<br>"; 
              text +=cars[1] + "<br>"; 
              text +=cars[2] + "<br>"; 
              break list;
              text +=cars[3] + "<br>"; 
              text +=cars[4] + "<br>"; 
              text +=cars[5] + "<br>"; 
          }
          

          親自試一試

          代碼塊指的是 { 與 } 直接的代碼片段。

          近作者看了一些關(guān)于JavaScript反調(diào)試的帖子,今天給大家整理一下希望有幫助哦~~~

          前言

          對(duì)于JavaScript來(lái)說(shuō),你只需要花一點(diǎn)時(shí)間進(jìn)行調(diào)試和分析,你就能夠了解到JavaScript代碼段的功能邏輯。而我們所要討論的內(nèi)容,可以給那些想要分析你JavaScript代碼的人增加一定的難度。不過(guò)我們的技術(shù)跟代碼混淆無(wú)關(guān),我們主要針對(duì)的是如何給代碼主動(dòng)調(diào)試增加困難。

          本文所要介紹的技術(shù)方法大致如下:

          1. 檢測(cè)未知的執(zhí)行環(huán)境(我們的代碼只想在瀏覽器中被執(zhí)行);
          2. 檢測(cè)調(diào)試工具(例如DevTools);
          3. 代碼完整性控制;
          4. 流完整性控制;
          5. 反模擬;
          就是如果我們監(jiān)控到到了“非正常”的情況,程序的運(yùn)行流程將會(huì)改變,并跳轉(zhuǎn)到偽造的代碼塊,并“隱藏”真正的功能代碼。

          一、對(duì)函數(shù)的重新定義

          這是一種最基本也是最常用的代碼反調(diào)試技能了。在JavaScript中,咱們能夠?qū)τ糜谒鸭畔⒌暮瘮?shù)進(jìn)行重新定義。例如,函數(shù)console.log()能夠用來(lái)搜集函數(shù)和變量等信息,并將其顯現(xiàn)在操控臺(tái)中。例如我們把這個(gè)函數(shù)重新定義一下,就能夠修改函數(shù)的行為,并隱去特定信息或顯現(xiàn)假的信息。

          可以在控制臺(tái)直接運(yùn)行這個(gè)函數(shù)來(lái)看一下結(jié)果:

          #測(cè)試代碼塊console.log("HelloWorld");var fake=function() {};window['console']['log']=fake;console.log("Youcan't see me!");

          運(yùn)行后結(jié)果:

          VM48:1 Hello World

          如上測(cè)試代碼,第二個(gè)信息console.log()信息并輸出,因?yàn)槲覀儼裞onsole.log()函數(shù)給重新定義了,即“禁用”了它原有的功能。但是我們也可以讓它顯示偽造后的信息,例如:

          console.log("Normalfunction");//First we save a reference to the original console.log functionvaroriginal=window['console']['log'];//Next we create our fake function//Basicly we check the argument and if match we call original function with otherparam.// If there is no match pass the argument to the original functionvar fake=function(argument) { if (argument==="Ka0labs") {
           original("Spoofed!");
           } else {
           original(argument);
           }
          }// We redefine now console.log as our fake functionwindow['console']['log']=fake;//Then we call console.log with any argumentconsole.log("Thisis unaltered");//Now we should see other text in console different to "Ka0labs"console.log("Ka0labs");//Aaaand everything still OK
          console.log("Byebye!");

          輸出結(jié)果:

          Normal functionVM117:11 This is unalteredVM117:9 Spoofed!VM117:11 Bye bye!

          實(shí)際上,為了操控代碼的運(yùn)行方式,咱們還能用更好的方法來(lái)修正函數(shù)的功用。例如,根據(jù)上述代碼來(lái)構(gòu)建一個(gè)代碼段,對(duì)eval函數(shù)重新定義。就能夠把JavaScript代碼傳遞給eval函數(shù),接下來(lái)代碼將會(huì)被計(jì)算并運(yùn)行。假如咱們重新定義了這個(gè)函數(shù),咱們就能夠運(yùn)行不同的代碼了:

          //Just a normal evaleval("console.log('1337')");//Now we repat the process...var original=eval;var fake=function(argument) { // If the code to be evaluated contains1337...if (argument.indexOf("1337") !==-1) { // ... we just execute a different code
           original("for (i=0; i < 10;i++) { console.log(i);}");
           } else {
           original(argument);
           }
          }eval=fake;eval("console.log('Weshould see this...')");//Now we should see the execution of a for loop instead of what is expectedeval("console.log('Too1337 for you!')");

          輸出運(yùn)行結(jié)果:

          1337VM146:1We should see this…VM147:10VM147:11VM147:12VM147:13VM147:14VM147:15VM147:16VM147:17VM147:18VM147:19

          這樣的方法雖然非常巧妙,但這也只是一種非常基礎(chǔ)并且常見(jiàn)的方法,也容易被檢測(cè)到。

          二、斷點(diǎn)

          我們?cè)诹私獯a的功能的時(shí)候,一般通過(guò)JavaScript調(diào)試工具(例如DevTools)通過(guò)設(shè)置斷點(diǎn)的方式來(lái)中斷或阻止腳本代碼的執(zhí)行,而斷點(diǎn)也是代碼調(diào)試中最基本的了。

          如果你研究過(guò)調(diào)試器或者x86架構(gòu),你可能會(huì)比較熟悉0xCC指令。在JavaScript中,我們有一個(gè)名叫debugger的類(lèi)似指令。當(dāng)我們?cè)诖a中聲明了debugger函數(shù)后,腳本代碼將會(huì)在debugger指令這里停止運(yùn)行。比如說(shuō):

          console.log("Seeme!");debugger;console.log("Seeme!");

          許多商業(yè)產(chǎn)品會(huì)在代碼中設(shè)置一個(gè)無(wú)限循環(huán)的debugger指令,不過(guò)某些瀏覽器會(huì)屏蔽這種代碼,而有些則不會(huì)。這種辦法的首要意圖就是讓那些想要調(diào)試你代碼的人感到厭煩,由于無(wú)限循環(huán)意味著代碼會(huì)不斷地彈出窗口來(lái)問(wèn)詢(xún)你是否要繼續(xù)運(yùn)轉(zhuǎn)腳本代碼:

          setTimeout(function(){while (true) {eval("debugger")

          更多精彩內(nèi)容可以關(guān)注“IT實(shí)戰(zhàn)聯(lián)盟”,也可以留言和作者互動(dòng)或者加入我們實(shí)戰(zhàn)交流群哦~~~


          主站蜘蛛池模板: 国产精品亚洲一区二区三区 | 中文字幕无线码一区2020青青| 无码国产精品一区二区免费式芒果| 精品国产一区二区三区无码| 久久精品综合一区二区三区| 国产精品亚洲一区二区无码 | 日韩在线视频一区| 国产成人精品无码一区二区| 国产精品小黄鸭一区二区三区| 无码中文字幕一区二区三区 | 日本精品少妇一区二区三区| 久久精品免费一区二区喷潮| 一区一区三区产品乱码| 在线中文字幕一区| 91精品一区二区三区久久久久| 精品少妇一区二区三区视频| 久久久久人妻一区精品| 精品国产AⅤ一区二区三区4区| 内射少妇一区27P| 日韩精品福利视频一区二区三区| 成人免费一区二区无码视频 | 日本韩国黄色一区二区三区 | 亚洲宅男精品一区在线观看| 无码国产精品一区二区免费16 | 亚洲字幕AV一区二区三区四区| 麻豆高清免费国产一区| 麻豆一区二区99久久久久| 亚洲一区二区影视| 亚洲欧洲日韩国产一区二区三区| 麻豆AV一区二区三区久久| 精品无码av一区二区三区| 精品日韩亚洲AV无码一区二区三区| 亚洲爆乳精品无码一区二区三区| 亚洲日韩激情无码一区 | 精品日韩在线视频一区二区三区 | 精品福利一区3d动漫| 国产一区二区三区无码免费| 国产精品男男视频一区二区三区| 国产成人无码一区二区在线观看| 国产精品视频一区二区三区四| 中文字幕精品一区影音先锋|