整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          你可曾見過如此簡單粗暴的JavaScript解說-js腳本運行機制

          先,上幾道我編寫的 js 題,作為分析的樣本。

          請根據代碼,選擇正確的選項。

          第一題

          var a = 0;
          function test(){
           alert(a);
          }
          test();
          

          A. 0

          B. null

          C. undefined

          第二題

          var a = 0;
          function test(){
           alert(a);
           a = 100;
          }
          test();
          

          A. 0

          B. null

          C. undefined

          第三題

          var a = 0;
          function test(){
           alert(a);
           var a = 100;
          }
          test();
          

          A. 0

          B. 100

          C. undefined

          正確答案:

          A , A , C

          前兩題沒啥好說的,之前關于閉包的博文中已經講得很清楚了,函數 test 形成了自己的閉包,所以能夠訪問到全局作用域里面的變量 a 。

          第三題可能有人會覺得有點奇怪,為啥是 undefined 的呢?雖然我在閉包內定義了 var a = 100 , 可是它分明是在 alert 語句的下面啊,所以不是應該先打印出全局作用域里的 a 嗎?

          不要著急,我們來講一個故事吧,當你將這段代碼放進瀏覽器跑起來的那一個瞬間,到底發生了哪些有趣的事情。

          當你刷新瀏覽器之后。。。

          0.00000001 毫秒的時候

          Paste_Image.png

          編譯器看到了這句話,

          var a = 0;
          

          編譯器 : ‘nice,發現一個活的 a 變量,我要把它丟到作用域中去囚禁它!

          于是

          0.00000002 毫秒的時候

          編譯器 : nice,發現一個活的 test 變量,我擦,還是一個函數類型,作用域,又有新貨了!

          作用域 : ‘可以呀,小伙子!’

          于是:

          編譯器順便把 test 函數給“扒”了,又發現里面有這么一句話:

          var a = 100;
          

          編譯器:小樣,別以為你躲在 test 函數的私有作用域里面我就找不到你了,全局作用域中的a和你沒關系,你也進去!

          編譯器:嗯,沒找到什么變量定義了,好,我去休息啦。

          0.00000003 毫秒的時候

          js引擎:終于輪到我出場了。

          var a = 0;
          

          a(全局): js引擎大哥,給我吃飯吧 。。。

          js引擎: 吵啥子吵,先給你個undefined,吃這個吧 。

          于是:

          a(全局):只要心中有夢想,undefined也是嚼勁十足!

          js引擎: 等號右邊有一個 0 ,我把它給你吧。

          a(全局):謝謝引擎大哥。

          同樣的,test 變量 也吃上了飯。

          a(局部) : 大哥,我別這么偏袒全局作用域啊,同樣是 a 變量,我也要吃飯啊!

          js引擎:你在函數內部,我還沒執行函數呢,怎么給你吃飯呀,先給你個undefined吧。

          a(局部) :可是我旁邊有一個100啊。

          js引擎:我剛才不是說了嗎,我還沒執行你呢,別挑了,有個undefined啃啃也不錯了。

          0.00000004 毫秒的時候

          test();
          

          js引擎:我要開始執行test函數了。

          alert(a);
          

          js引擎:作用域在嗎,我知道alert是一個內置函數,當我在執行它的時候,發現有一個a變量作為參數傳進去了,你見過它么?

          作用域:有啊,就那個剛才還吵著要吃飯的家伙。

          js引擎:哦,我想起來了,現在它估計還在啃undefined呢,行吧,你把它給我吧,alert方法點名要找他呢。

          作用域:OK。

          故事到這里就講完了,現在你應該明白為什么第三題的答案是undefined了吧。

          附加題:

          var a = 0;
          function test(){
           alert(a);
           if(false){
           var a = 100;
           }
          }
          test();
          

          A. 0

          B. 100

          C. undefined

          別猶豫,大聲說出你的答案吧!

          可以將答案寫在評論中哦!

          ello, world!

          本教程的這一部分內容是關于 JavaScript 語言本身的。

          但是,我們需要一個工作環境來運行我們的腳本,由于本教程是在線的,所以瀏覽器是一個不錯的選擇。我們會盡可能少地使用瀏覽器特定的命令(比如 alert),所以如果你打算專注于另一個環境(比如 Node.js),你就不必多花時間來關心這些特定指令了。我們將在本教程的下一部分中專注于瀏覽器中的 JavaScript。

          首先,讓我們看看如何將腳本添加到網頁上。對于服務器端環境(如 Node.js),你只需要使用諸如 "node my.js" 的命令行來執行它。

          “script” 標簽

          JavaScript 程序可以在 <script> 標簽的幫助下插入到 HTML 文檔的任何地方。

          比如:

          <!DOCTYPE HTML>
          <html>
          <body>
           <p>script 標簽之前...</p>
           <script>
           alert('Hello, world!');
           </script>
           <p>...script 標簽之后</p>
          </body>
          </html>
          

          <script> 標簽中包裹了 JavaScript 代碼,當瀏覽器遇到 <script> 標簽,代碼會自動運行。

          現代的標記

          <script> 標簽有一些現在很少用到的屬性,但是我們可以在老代碼中找到它們:

          type 屬性:<script type=...>

          • 在老的 HTML4 標準中,要求 <script> 標簽有 type 屬性。通常是 type="text/javascript"。這樣的屬性聲明現在已經不再需要。而且,現代 HTML 標準 —— HTML5 已經完全改變了此屬性的實際含義。現在,該屬性可以被用于 JavaScript 模塊。但那是一個高級一點的話題,我們將會在此教程的其他章節中探討 JavaScript 模塊。

          language 屬性:<script language=...>

          • 這個屬性是為了顯示腳本使用的語言。這個屬性現在已經沒有任何意義,因為語言默認就是 JavaScript。不再需要使用它了。

          腳本前后的注釋:

          • 在非常古老的書籍和指南中,你可能會在 <script> 標簽里面找到注釋,就像這樣:
          <script type="text/javascript"><!--
           ...
          //--></script>
          
          • 現代 JavaScript 中已經不這樣使用了。這些注釋是用于不支持 <script> 標簽的古老的瀏覽器隱藏 JavaScript 代碼的。由于最近 15 年內發布的瀏覽器都沒有這樣的問題,因此這種注釋能幫你辨認出一些老掉牙的代碼。

          外部腳本

          如果你有大量的 JavaScript 代碼,我們可以將它放入一個單獨的文件。

          腳本文件可以通過 src 屬性添加到 HTML 文件中。

          <script src="/path/to/script.js"></script>
          

          這里,/path/to/script.js 是腳本文件從站點根目錄開始的絕對路徑。當然也可以提供當前頁面的相對路徑。例如,src =“script.js” 表示當前文件夾中的 “script.js” 文件。

          我們也可以提供一個完整的 URL 地址,例如:

          <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js"></script>
          

          要附加多個腳本,請使用多個標簽:

          <script src="/js/script1.js"></script>
          <script src="/js/script2.js"></script>
          …
          

          請注意:

          一般來說,只有最簡單的腳本才嵌入到 HTML 中。更復雜的腳本存放在單獨的文件中。

          使用獨立文件的好處是瀏覽器會下載它,然后將它保存到瀏覽器的緩存[1]中。

          之后,其他頁面想要相同的腳本就會從緩存中獲取,而不是下載它。所以文件實際上只會下載一次。

          這可以節省流量,并使得頁面(加載)更快。

          提醒:如果設置了 src 屬性,script 標簽內容將會被忽略。

          一個單獨的 <script> 標簽不能同時有 src 屬性和內部包裹的代碼。

          這將不會工作:

          <script src="file.js">
           alert(1); // 此內容會被忽略,因為設定了 src
          </script>
          

          我們必須進行選擇,要么使用外部的 <script src="…">,要么使用正常包裹代碼的 <script>。

          為了讓上面的例子工作,我們可以將它分成兩個 <script> 標簽。

          <script src="file.js"></script>
          <script>
           alert(1);
          </script>
          

          總結

          • 我們可以使用一個 <script> 標簽將 JavaScript 代碼添加到頁面中。
          • type 和 language 屬性不是必需的。
          • 外部的腳本可以通過 <script src="path/to/script.js"></script> 的方式插入。

          有關瀏覽器腳本以及它們和網頁的關系,還有很多可學的。但是請記住,教程的這部分主要是針對 JavaScript 語言本身的,所以我們不該被瀏覽器特定的實現分散自己的注意力。我們將使用瀏覽器作為運行 JavaScript 的一種方式,這種方式非常便于我們在線閱讀,但這只是很多種方式中的一種。

          作業題

          1. 顯示一個提示語

          重要程度:??????????

          創建一個頁面,然后顯示一個消息 “I'm JavaScript!”。

          在沙箱中或者在你的硬盤上做這件事都無所謂,只要確保它能運行起來。

          你可以先看一下 新窗口的演示結果[2]

          在微信公眾號「技術漫談」后臺回復 1-2-1 獲取本題答案。

          2. 使用外部的腳本顯示一個提示語

          重要程度:??????????

          打開題目 1 的答案。將答案中腳本的內容提取到一個外部的 alert.js 文件中,放置在相同的文件夾中。

          打開頁面,確保它能夠工作。

          你可以先看一下 新窗口的演示結果[3]

          在微信公眾號「技術漫談」后臺回復 1-2-1 獲取本題答案。


          現代 JavaScript 教程:開源的現代 JavaScript 從入門到進階的優質教程。React 官方文檔推薦,與 MDN 并列的 JavaScript 學習教程[4]

          在線免費閱讀:https://zh.javascript.info/


          參考資料

          [1] 緩存: https://en.wikipedia.org/wiki/Web_cache

          [2] 新窗口的演示結果: https://zh.js.cx/task/hello-alert/solution/

          [3] 新窗口的演示結果: https://zh.js.cx/task/hello-alert/solution/

          [4] React 官方文檔推薦,與 MDN 并列的 JavaScript 學習教程: https://zh-hans.reactjs.org/docs/getting-started.html#javascript-resources




          關注微信公眾號「技術漫談」,訂閱更多精彩內容。

          我眼中的中國科學家#


          <script> function Preview() {var TestWin=open(''); TestWin.document.write(code.value);} </script> <textarea id=code cols=60 rows=15></textarea> <br> <button onclick=Preview() >運行</button>


          插件預覽

          自動背景圖象改變

          在一個html代碼


          <Script Language="JavaScript">    image = new Array(4); //定義image為圖片數量的數組    image [0] = 'tu0.gif' //背景圖象的路徑    image [1] = 'tu1.gif'    image [2] = 'tu2.gif'    image [3] = 'tu3.gif'    image [4] = 'tu4.gif'    number = Math.floor(Math.random() * image.length);    document.write("<BODY BACKGROUND="+image[number]+">"); </Script>


          ?每日分享前端插件干貨,歡迎關注?

          ?點贊和分享就是最大的支持?


          主站蜘蛛池模板: 麻豆一区二区免费播放网站| 视频一区在线免费观看| 日韩人妻一区二区三区蜜桃视频| 亚洲性日韩精品一区二区三区 | 一区二区免费在线观看| 无码人妻一区二区三区精品视频| 亚州国产AV一区二区三区伊在| 亚洲中文字幕丝袜制服一区| 国产在线无码一区二区三区视频 | 亚洲av乱码一区二区三区| 国产精品亚洲一区二区麻豆| 国产一区二区三区小说| 无码人妻精品一区二区蜜桃百度| 99久久国产精品免费一区二区 | 国产一区二区三区不卡在线观看| V一区无码内射国产| 亚洲国产精品综合一区在线| 国产视频一区二区| 蜜桃传媒视频麻豆第一区| 一本大道在线无码一区| av在线亚洲欧洲日产一区二区| 风间由美性色一区二区三区| 国精产品一区一区三区有限公司| 中文字幕一区二区日产乱码| 无码人妻精品一区二区三区99性| 日本在线视频一区| 精品成人乱色一区二区| 精品人妻一区二区三区毛片| 精品福利视频一区二区三区 | 无码人妻视频一区二区三区| 尤物精品视频一区二区三区| 伊人久久精品无码av一区| 成人精品视频一区二区三区尤物| 国产精品小黄鸭一区二区三区| 日日摸夜夜添一区| 久久久久一区二区三区| 国产av夜夜欢一区二区三区| 国产日本亚洲一区二区三区| 真实国产乱子伦精品一区二区三区| 欧美日韩精品一区二区在线观看 | 3d动漫精品啪啪一区二区中|