信大家在使用一些軟件的時候會發現,只要點擊了它們的一些網頁廣告就會運行一些推廣軟件或者是官方軟件。它們是怎么實現的呢?其實方法很簡單,聽來群網慢慢道來。
下面鏈接是微軟MSDN上的說明,為了大家易懂,所以在這里分享給大家:http://msdn.microsoft.com/en-us/library/aa767914%28v=vs.85%29.aspx
當然,或許還有更復雜的方法,小編只舉一個簡單的例子。
此方法分兩部份:1. 注冊表代碼部份; 2. HTML代碼部份
1.注冊表代碼:
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\laiqun] @="laiqun Protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\laiqun\DefaultIcon] @="C:\\WINDOWS\\NOTEPAD.EXE" [HKEY_CLASSES_ROOT\>laiqun\shell] @="" [HKEY_CLASSES_ROOT\laiqun\shell\open] @="" [HKEY_CLASSES_ROOT\laiqun\shell\open\command] @="\"C:\\WINDOWS\\NOTEPAD.EXE\" "
注釋:laiqun代表鏈接前綴如:[laiqun://], 可修改為您想要的前綴。
C:\WINDOWS\NOTEPAD.EXE\ 代表需要執行EXE的路徑(可執行文件),可替換您想運行的程序。
修改完后保存,將TXT文件重命名為【文件名.Reg】然后運行就加入注冊表中(如下圖)
注冊表代碼
2.html代碼:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <div> <a href="laiqun://">此處文字按需修改</a> </a> </div> </body> </html>
把上面的html代碼復制到notepad++,修改完成后點擊保存,然后把TXT后綴修改成html即可(如下圖)。
HTML代碼
打開html文件點擊里面的鏈接就能直接打開筆記本,我里面路徑寫的是記事本程序的路徑,所以點擊的時候是打開記事本,這個文件路徑可以在注冊表程序中修改。
注意:編輯代碼建議使用 notepad++等專業文本編輯器,不建議使用電腦自帶的記事本。
好了,關于 html(網頁)運行本地程序(exe文件)的方法與源碼 的教程就到這里,謝謝大家支持。
如果大家有什么不明白的地方,可以在下方評論、留言。
幾乎每個人都聽說過 v8引擎這個概念,大多數人都知道 JavaScript 是單線程的,或者它使用的是回調隊列。
執行 JavaScript 代碼所涉及的核心組件包括運行時環境和瀏覽器,他們內部如何工作呢?
JavaScript 是一種解釋性編程腳本語言,JavaScript 引擎就是一個執行 JavaScript 代碼的計算機程序:解釋器,當 JavaScript 文件在瀏覽器中加載時,負責逐行解析代碼,將其轉換為機器代碼,然后執行它。
每個瀏覽器都有自己的 JavaScript 引擎,但最著名的是 Google 的 v 8引擎。V8引擎不僅為 Google Chrome 提供動力,還為 Node.js 提供動力,這就是 JavaScript 運行時。
引擎由兩個主要組件組成:
Call Stack調用堆棧:計算模型:棧下推自動機,圖靈等價。
JS是一種單線程的編程語言,這意味著它只有一個 Call Stack。因此,它可以一次只做一件事。并且不必處理在多線程環境中出現的復雜場景(例如,死鎖)。
調用堆棧是一種數據結構,它基本上記錄我們在程序中的位置。如果我們進入一個函數,我們把它放在堆棧的頂部。如果我們從一個函數返回,我們將從堆棧頂部彈出。
JavaScript 引擎并不是孤立運行的。它和許多其他組件一起運行在一個叫做JavaScript Runtime Environment 中。
JRE 負責JavaScript 的異步執行。組件包含:
雖然是單線程,為了處理多任務,需要并發交替執行,
并發、多線程、多進程、異步編程和事件循環等是一組相關概念,交織在PL和OS的中間。
首先,并發性是一個概念,它能夠無序地處理多個任務。任務一般分為計算密集和讀寫密集。
real world,一個餐廳,一排人點菜后,后廚出菜就是無序的,有的菜工序復雜就得多等,這就是異步,同步就是先來后到一個個上完菜。
實現并發性的技術很多,包括多線程、多進程和異步編程。
異步編程, 比如node.js并發性 使用的異步 i/o,將 i/o 操作移交給操作系統內核,并將 i/o 操作的回調推遲。異步io這個任務就放在事件循環隊列進行調度。
由此各組件基本解釋一番。
擊右上方紅色按鈕關注“小鄭搞碼事”,每天都能學到知識,搞懂一個問題!
先來看這段代碼,大家看表示什么意思。
一眼看過去,非常熟悉,通常我們會這樣理解:這段代碼表示1秒后,會執行setTimeout里面那個函數。
然而,這種解釋并不準確, 那應該怎么理解呢? 我們先來理解JavaScript的遠行機制。
本文最后我會給出JavaScript的運行機制完整圖。但在這之前,我想先來給大家解釋幾個問題。
JavaScript設計的初衷是用在瀏覽器中, 那么,我們來想象一下,如果JavaScript是多線程的話。
必然可以有兩個進程,process1和process2,那么這兩個進程可以同時對同一個DOM進行操作。如果這個時候,一個進程要刪除這個DOM,另一個進程要編輯這個DOM。啟不是矛盾嘛。
所以,這樣應該更好理解,JS為什么是單線程了。
單線程為什么需要異步呢?
JavaScript如果不存在異步,而是自上而下執行,這樣的話,假如上一行解析時間很長,那么下面的代碼直接就會被阻塞。這種現象對于用戶來說,意味著"卡死"。嚴重影響用戶流失,這樣解釋好理解吧,所以JavaScript需要異步處理。
JavaScript竟然需要異步,那么它是如何實現異步的呢?
JavaScript是通過事件循環(event loop)來實現的,事件循環機制也就是今天要說的JavaScript運行機制。
(一)同步任務和異步任務
來看一段代碼:
首先這段代碼輸出結果是啥?
輸出:1 3 2
其中setTimeout需要延遲一段時間才去執行,這類代碼就是異步代碼。
看到這個結果,所以通常我們都這么理解JS的執行原理:
第一,判斷JS是同步還是異步,同步進入主線程,異步則進入event table。
第二,異步任務在event table中注冊函數,當滿足觸發條件后,被推入event queue(事件隊列)。
第三,同步任務進入主線程后一直執行,直到主線程空閑,才會去event queue中查看是否有可執行的異步任務,如果有就推入主線程。
按到這個邏輯,上面這段實例代碼,是不是就很好理解了。1,3是同步任務進入主要線程,自上而下執行,2是異步任務,滿足觸發條件后,推入事件隊列,等待主線程有空時調用。
(二)宏任務(macro-task)和微任務(micro-task)
然而,按照同步和異步任務來理解JS的運行機制似乎并不準確。
來看一段代碼??纯此妮敵鲰樞?。
上面這段代碼,按同步和異步的理解,輸出結果是:2,4,1,3。因為2,4是同步任務,按順序在主線程自上而下執行,而1,3是異步任務,按順序在主線程有空后自先而后執行。
可事實輸出并不是這個結果,而是這樣的:2,4,3,1。為什么呢?來理解一下宏任務和微任務。
寵任務:包括整體script代碼,setTimeout,setInterval。
微任務:Promise,process.nextTick。
來看原理圖:
嗯,對,這就是JS的運行機制。也就是事件循環。解釋一下:
第一,執行一個宏任務(主線程的同步script代碼),過程中如果遇到微任務,就將其放到微任務的事件隊列里。
第二,當前宏任務執行完成后,會查微任務的事件隊列,將將全部的微任務依次執行完,再去依次執行宏任務事件隊列。
上面代碼中promise的then是一微任務,因此它的執行在setTimeout之前。
需要注意的是:在node環境下,process.nextTick的優先級高于promise。也就是可以簡單理解為,在宏任務結束后會先執行微任務隊列中的nextTickQueue部分,然后才會執行微任務中的promise部分。
所以最后總結一下,對于文章一開頭提到的那段代碼,我們可以準確的理解為:
1秒后,setTimeout里的函數會被推入event queue,而event queue(事件隊列)里的任務,只有在主線程空閑時才會執行。也就是需要同時滿足兩個條件(1)1秒后。(2)主線程必須空閑,這樣1秒后才會執行該函數。
現在,關于JavaScript的運行機制,大家應該都理解了,有問題歡迎留言。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。