當javaScript從入門到提高前需要注意的細節:變量部分

到了HTML5的時代,對javaScript的要求不是降低了,而是更提高了。javaScript語言的入門非常簡單,如果你有java、C#等C風格的結構化語言的基礎,那javaScript你最多半天就可以寫點什么了。但是javaScript是一種動態語言,這個特性決定了他在很多方面和java、C#等語言有極大的不同。很多人說只要會java、C#就可以在短時間內搞定javaScript,估計一般都是吹牛來的,用javaScript寫點簡單的應用沒有問題,如果要完全比較好的掌握,那需要真正的理解javaScript的動態這個特性。
當你快速的了解的javaScript入門編程后,在提高開發能力之前,需要的是確保掌握javaScript的編程細節或者說特殊性。
而且和css在不同的瀏覽器中有兼容性問題一樣,javaScript在不同的瀏覽器和版本中也同樣有不同的變化。


我認為javaScript入門之后,向中級(基于面向對象的編程)發展之前,有兩個問題會對開發者有影響:類型的動態和語法的靈活性。而這兩點的集合,是另很多入門級的javaScript人員造成各種詭異問題的核心。我這篇文章不討論關于語法的基礎,關于核心對象的方法,也不關心dom的處理,這些內容在網上的任何javaScript教程中都有,我們討論一個些基于代碼級別但容易寫錯的地方,為你將來的高質量的javaScript奠定些好的基礎。


我以下的內容是在IE7/8、Chrome14、FireFox10下進行測試。同時聲明一個事情,下面的內容的次序比較隨意,比javaScript還隨意,不是作為一步步的教程給零基礎看的。需要你至少有些javaScript的代碼經驗了。
?

關于變量部分

在javaScript中變量使用var聲明的變量是當前作用域的變量,不使用var聲明的則肯定是全局變量。

 
  1. <script?type="text/javascript"> ?
  2. ?
  3. ????var?x?=?10;?//全局 ?
  4. ????y?=?100;?//全局 ?
  5. ?
  6. ????function?fun1()?{ ?
  7. ????????var?m?=?99;?//局部 ?
  8. ????????n?=?9;?//全局 ?
  9. ????} ?
  10. ?
  11. ????alert(typeof?this.x);?//number ?
  12. ????alert(typeof?this.y);?//number ?
  13. ????alert(typeof?this.m);?//undefined ?
  14. ????alert(typeof?this.n);?//undefined ?
  15. ????fun1(); ?
  16. ????alert(typeof?this.m);?//undefined ?
  17. ????alert(typeof?this.n);?//number ?
  18. ???? ?
  19. ?
  20. </script>?

以上代碼說明,當fun1被執行后,函數內沒有用var聲明的n變量,被注冊為全局變量了。

下面的代碼得到同樣的執行效果

 
  1. <script?type="text/javascript"> ?
  2. ?
  3. ????var?x?=?10;?//全局 ?
  4. ????y?=?100;?//全局 ?
  5. ?
  6. ????function?fun1()?{ ?
  7. ????????var?m?=?99;?//局部 ?
  8. ????????n?=?9;?//全局 ?
  9. ????} ?
  10. ?
  11. ????alert(typeof?window.x);?//number ?
  12. ????alert(typeof?window.y);?//number ?
  13. ????alert(typeof?window.m);?//undefined ?
  14. ????alert(typeof?window.n);?//undefined ?
  15. ????fun1(); ?
  16. ????alert(typeof?window.m);?//undefined ?
  17. ????alert(typeof?window.n);?//number ?
  18. ???? ?
  19. ?
  20. </script>?

那么,我們可以明顯的得到一個推理,在全局里面,window和this是同一個對象指向。

 
  1. <script?type="text/javascript"> ?
  2. ????alert(this?==?window); ?
  3. ????alert(this?===?window); ?
  4. </script>?

那么下面的函數在其函數狀態和對象狀態時this的指向是不同的,因為javaScript的動態的執行,當其執行到的時候,才去計算上下文情況。

 
  1. <script?type="text/javascript"> ?
  2. ?
  3. ????function?Fo1()?{ ?
  4. ????????return?this; ?
  5. ????} ?
  6. ?
  7. ????alert(Fo1()); ?
  8. ????alert(new?Fo1()); ?
  9. ???? ?
  10. </script>?

同樣作為變量,使用var聲明的變量是不可以刪除的,沒有使用var聲明的變量是可以刪除的

 
  1. var?x?=?10;?//全局 ?
  2. y?=?100;?//全局 ?
  3. ?
  4. function?fun1()?{ ?
  5. ????var?m?=?99;?//局部 ?
  6. ????n?=?9;?//全局 ?
  7. ????delete?m; ?
  8. ????delete?n; ?
  9. ????alert(typeof?m);?//number ?
  10. ????alert(typeof?n);?//undefined ?
  11. } ?
  12. ?
  13. delete?x; ?
  14. delete?y; ?
  15. ?
  16. alert(typeof?x);?//number ?
  17. alert(typeof?y);?//undefined ?
  18. fun1(); ?
  19. alert(typeof?n);?//undefined?

在javaScript中聲明變量非常的靈活,但這個靈活性,對控制全局和局部要有所注意。

 
  1. function?fun1()?{ ?
  2. ????var?m?=?n?=?10;?//n是全局,m是局部 ?
  3. ????var?x,?y?=?1,?k?=?10;?//xyk都是局部 ?
  4. }?

而且,有意思的是,在通常的語言中,我們對變量總是先定義后使用,不過在javaScript中嘛……看以下代碼

 
  1. function?fun1()?{ ?
  2. ????alert(typeof?x);?//undefined ?
  3. ????alert(typeof?y);?//undefined ?
  4. ????var?x?=?10; ?
  5. ????alert(typeof?x);?//number ?
  6. } ?
  7. ?
  8. fun1();?

這樣的結果,對你來說是完全可以接受和預期的,不過……

 
  1. function?fun1()?{ ?
  2. ????alert(x);?//undefined ?
  3. ????alert(y);?//提示y沒有定義 ?
  4. ????var?x?=?10; ?
  5. ????alert(x);?//number ?
  6. } ?
  7. ?
  8. fun1();?

上面的現象很奇怪,如果我們當真要用x和y的時候,編譯器卻給予不同的對待,認為x僅僅是沒有定義(認可已經聲明了),而y是真正的不存在。這說明在處理一個范圍的變量的時候,var無論你在哪里聲明的,總是一開始就進行分配了。對于非var定義的變量嘛,就沒有這樣的待遇了,必須等執行到才進行分配

 
  1. <pre?name="code"?class="html">function?fun1()?{ ?
  2. ????alert(x);?//提示x沒有定義 ?
  3. ????alert(y);?//提示y沒有定義 ?
  4. ????x?=?10; ?
  5. ????alert(x);?//number ?
  6. } ?
  7. fun1();?

更需要注意的是,在函數內部聲明的var變量,并不局限在聲明的代碼語句塊中,看看以下代碼

 
  1. function?fun1()?{ ?
  2. ????for?(var?i?=?0;?i?<?10;?i++)?{ ?
  3. ?
  4. ????} ?
  5. ????alert(i);?//10 ?
  6. } ?
  7. ?
  8. fun1();?

所以呢,我們推薦在一個對象/函數的第一行就把所有的局部變量全部聲明完畢

 
  1. function?fun1()?{ ?
  2. ????var?value?=?1, ?
  3. ????arr?=?[], ?
  4. ?????obj?=?{}, ?
  5. ????date?=?new?Date(), ?
  6. ????has?=?false; ?
  7. }?

注意變量之間用逗號隔離,這樣的好處是明顯的,自己去考慮吧。
javaScript的語法很靈活,語句后面可以不加;來表示結束,這個時候編譯器會講硬回車作為語句的結束符合

 
  1. function?fun1()?{ ?
  2. ????var?x?=?10 ?
  3. ????var?y?=?9 ?
  4. ????return?x?+?y ?
  5. } ?
  6. ?
  7. alert(fun1());?//19?

以上的代碼寫法我不知道有什么特別的好處,如果是炫耀你知道可以不用;來結束語句,那就到此為止吧。因為下面的代碼會得到一個錯誤

 
  1. function?fun1()?{ ?
  2. ????return? ?
  3. ????{ ?
  4. ????????Title:?"title", ?
  5. ????????Style:?"style", ?
  6. ????????Value:?"Value"?
  7. ????} ?
  8. } ?
  9. ?
  10. alert(typeof?fun1());??

因為javaScript會再return后面加一個;
?

?

正確的做法是

 
  1. function?fun1()?{ ?
  2. ????return?{ ?
  3. ????????Title:?"title", ?
  4. ????????Style:?"style", ?
  5. ????????Value:?"Value"?
  6. ????}; ?
  7. } ?
  8. ?
  9. alert(typeof?fun1());??

我不好說,這個原因一定是;不寫引起的,但我想說明的是,你要小心javaScript對隨意代碼的隨意處理:你總是應該讓javaScript編譯器知道你明確的要干嘛,而不是由他去猜呀猜的。



本文轉自shyleoking 51CTO博客,原文鏈接:http://blog.51cto.com/shyleoking/803091

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393157.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PAT乙級 1003. 我要通過!

題目&#xff1a; “答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬于PAT的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件&#xff0c;系統就輸出“答案正確”&#xff0c;否則輸出“答案錯誤”。 得到“答案正確”的條件是&#xff1a; 1. 字符串中必須僅有…

電臺復活節_如何通過在控制臺中隱藏復活節彩蛋使您的應用程序用戶驚訝

電臺復活節by Ethan Ryan由伊桑瑞安(Ethan Ryan) 如何通過在控制臺中隱藏復活節彩蛋使您的應用程序用戶驚訝 (How to surprise your app’s users by hiding Easter eggs in the console) I love console.logging(“stuff”).我喜歡console.logging(“ stuff”)。 I do it th…

leetcode1267. 統計參與通信的服務器(dfs)

這里有一幅服務器分布圖&#xff0c;服務器的位置標識在 m * n 的整數矩陣網格 grid 中&#xff0c;1 表示單元格上有服務器&#xff0c;0 表示沒有。 如果兩臺服務器位于同一行或者同一列&#xff0c;我們就認為它們之間可以進行通信。 請你統計并返回能夠與至少一臺其他服務…

System類入門學習

第三階段 JAVA常見對象的學習 System類 System類包含一些有用的字段和方法&#xff0c;他不能被實例化 //用于垃圾回收 public static void gc()//終止正在運行的java虛擬機。參數用作狀態碼&#xff0c;根據慣例&#xff0c;非0表示異常終止 public static void exit(int stat…

gulpfile php,Laravel利用gulp如何構建前端資源詳解

什么是gulp&#xff1f;gulp是新一代的前端項目構建工具&#xff0c;你可以使用gulp及其插件對你的項目代碼(less,sass)進行編譯&#xff0c;還可以壓縮你的js和css代碼&#xff0c;甚至壓縮你的圖片&#xff0c;gulp僅有少量的API&#xff0c;所以非常容易學習。 gulp 使用 st…

ios jenkins_如何使用Jenkins和Fastlane制作iOS點播構建系統

ios jenkinsby Agam Mahajan通過Agam Mahajan 如何使用Jenkins和Fastlane制作iOS點播構建系統 (How to make an iOS on-demand build system with Jenkins and Fastlane) This article is about creating iOS builds through Jenkins BOT, remotely, without the need of a de…

菜鳥也學hadoop(1)_搭建單節點的hadoop

其實跟官方的教程一樣 只是 我想寫下來 避免自己搞忘記了&#xff0c;&#xff0c;&#xff0c;&#xff0c;好記性不如爛筆頭 首先確認自己是否安裝了 java&#xff0c; ssh 以及 rsync 沒有裝的直接就 apt-get install 了嘛&#xff0c;&#xff0c;&#xff0c;java的不一定…

SP703 SERVICE - Mobile Service[DP]

題意翻譯 Description   一個公司有三個移動服務員。如果某個地方有一個請求&#xff0c;某個員工必須趕到那個地方去&#xff08;那個地方沒有其他員工&#xff09;&#xff0c;某一時刻只有一個員工能移動。只有被請求后&#xff0c;他才能移動&#xff0c;不允許在同樣的位…

CF758 D. Ability To Convert 細節處理字符串

link 題意&#xff1a;給定進制數n及一串數字,問在此進制下這串數能看成最小的數&#xff08;10進制&#xff09;是多少&#xff08;如HEX下 1|13|11 475&#xff09; 思路&#xff1a;此題要仔細思考細節。首先要想使數最小那么必定有個想法是使低位的數盡可能大即位數盡可能…

java 可能尚未初始化變量,java - 局部變量“變量”可能尚未初始化-Java - 堆棧內存溢出...

我得到這個錯誤。線程“主”中的異常java.lang.Error&#xff1a;未解決的編譯問題&#xff1a;rgb2無法解析為變量它總是導致錯誤的rgb2數組。 如何解決這個問題呢&#xff1f;BufferedImage img1 ImageIO.read(file1);BufferedImage img2 ImageIO.read(file2);int w img1.…

leetcode1249. 移除無效的括號(棧)

給你一個由 ‘(’、’)’ 和小寫字母組成的字符串 s。 你需要從字符串中刪除最少數目的 ‘(’ 或者 ‘)’ &#xff08;可以刪除任意位置的括號)&#xff0c;使得剩下的「括號字符串」有效。 請返回任意一個合法字符串。 有效「括號字符串」應當符合以下 任意一條 要求&…

軟件工程——個人課程總結

軟件工程&#xff0c;我就是沖著軟件這兩個字來的&#xff0c;開始我覺得我們大多數人也是這樣的&#xff0c;能開發一款屬于自己的軟件應該是我們人生中的第一個小目標八&#xff0c;在上學期學完java語言后&#xff0c;我們自認為自己已經具備了開發一款小軟件的能力&#xf…

規則網絡_實用的網絡可訪問性規則

規則網絡by Tiago Romero Garcia蒂亞戈羅梅羅加西亞(Tiago Romero Garcia) 實用的網絡可訪問性規則 (Pragmatic rules of web accessibility that will stick to your mind) I first started to work with web accessibility back in 2015, at an American retail giant. It h…

8-python自動化-day08-進程、線程、協程篇

本節內容 主機管理之paramiko模塊學習 進程、與線程區別python GIL全局解釋器鎖線程語法join線程鎖之Lock\Rlock\信號量將線程變為守護進程Event事件 queue隊列生產者消費者模型Queue隊列開發一個線程池進程語法進程間通訊進程池 轉載&#xff1a;  http://www.cnblogs.co…

部署HDFS HA的環境

> 環境架構部署規劃&#xff1a; bigdata1 NameNode ResourceManager Zookeeper JournalNode failOverController bigdata2 NameNode ResourceManager Zookeeper JournalNode failOverController bigdata3 DataNode NodeManager Zookeeper bigdata4 DataNode NodeManager &g…

php layui 框架,Thinkphp5+Layui高顏值內容管理框架

Thinkphp5Layui高顏值內容管理框架TP5Layui高顏值內容管理框架&#xff0c;新增API模塊Thinkphp5Layui響應式后臺權限管理系統專注打造好用的框架&#xff0c;極速開發&#xff0c;高效靈活&#xff0c;從架構上兼顧系統復雜度的迭代與需求多變。代碼結構清晰&#xff0c;接口開…

leetcode657. 機器人能否返回原點

在二維平面上&#xff0c;有一個機器人從原點 (0, 0) 開始。給出它的移動順序&#xff0c;判斷這個機器人在完成移動后是否在 (0, 0) 處結束。 移動順序由字符串表示。字符 move[i] 表示其第 i 次移動。機器人的有效動作有 R&#xff08;右&#xff09;&#xff0c;L&#xff…

在Angular專家Dan Wahlin的免費33部分課程中學習Angular

According to the Stack Overflow developer survey 2018, Angular is one of the most popular frameworks/libraries among professional developers. So learning it increases your chances of getting a job as a web developer significantly.根據2018年Stack Overflow開…

select查詢語句執行順序

查詢中用到的關鍵詞主要包含六個&#xff0c;并且他們的順序依次為 select--from--where--group by--having--order by 其中select和from是必須的&#xff0c;其他關鍵詞是可選的&#xff0c;這六個關鍵詞的執行順序 與sql語句的書寫順序并不是一樣的&#xff0c;而是按照下面的…

Python的Virtualenv(虛擬環境)的使用(Windows篇)2

Python的Virtualenv(虛擬環境)的使用&#xff08;Windows篇&#xff09; 2018年04月13日 11:35:01 D_FallMoon 閱讀數 771 版權聲明&#xff1a;版權所有 裝載請注明 …