先,上幾道我編寫的 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
別猶豫,大聲說出你的答案吧!
可以將答案寫在評論中哦!
本教程的這一部分內容是關于 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=...>
language 屬性:<script language=...>
腳本前后的注釋:
<script type="text/javascript"><!-- ... //--></script>
外部腳本
如果你有大量的 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>
總結
有關瀏覽器腳本以及它們和網頁的關系,還有很多可學的。但是請記住,教程的這部分主要是針對 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>
?每日分享前端插件干貨,歡迎關注?
?點贊和分享就是最大的支持?
*請認真填寫需求信息,我們會在24小時內與您取得聯系。