到了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/八、Chrome1四、FireFox10下進行測試。同時聲明一個事情,下面的內容的次序比較隨意,比javaScript還隨意,不是做爲一步步的教程給零基礎看的。須要你至少有些javaScript的代碼經驗了。
關於變量部分 javascript
在javaScript中變量使用var聲明的變量是當前做用域的變量,不使用var聲明的則確定是全局變量。 css
01 |
<script type="text/javascript"> |
11 |
alert(typeof this.x); //number |
12 |
alert(typeof this.y); //number |
13 |
alert(typeof this.m); //undefined |
14 |
alert(typeof this.n); //undefined |
16 |
alert(typeof this.m); //undefined |
17 |
alert(typeof this.n); //number |
以上代碼說明,當fun1被執行後,函數內沒有用var聲明的n變量,被註冊爲全局變量了。
下面的代碼獲得一樣的執行效果 html
01 |
<script type="text/javascript"> |
11 |
alert(typeof window.x); //number |
12 |
alert(typeof window.y); //number |
13 |
alert(typeof window.m); //undefined |
14 |
alert(typeof window.n); //undefined |
16 |
alert(typeof window.m); //undefined |
17 |
alert(typeof window.n); //number |
那麼,咱們能夠明顯的獲得一個推理,在全局裏面,window和this是同一個對象指向。 java
1 |
<script type="text/javascript"> |
3 |
alert(this === window); |
那麼下面的函數在其函數狀態和對象狀態時this的指向是不一樣的,由於javaScript的動態的執行,當其執行到的時候,纔去計算上下文狀況。 編程
01 |
<script type="text/javascript"> |
樣做爲變量,使用var聲明的變量是不能夠刪除的,沒有使用var聲明的變量是能夠刪除的 瀏覽器
09 |
alert(typeof m); //number |
10 |
alert(typeof n); //undefined |
16 |
alert(typeof x); //number |
17 |
alert(typeof y); //undefined |
19 |
alert(typeof n); //undefined |
在javaScript中聲明變量很是的靈活,但這個靈活性,對控制全局和局部要有所注意。 dom
2 |
var m = n = 10; //n是全局,m是局部 |
3 |
var x, y = 1, k = 10; //xyk都是局部 |
並且,有意思的是,在一般的語言中,咱們對變量老是先定義後使用,不過在javaScript中嘛……看如下代碼 函數
2 |
alert(typeof x); //undefined |
3 |
alert(typeof y); //undefined |
5 |
alert(typeof x); //number |
這樣的結果,對你來講是徹底能夠接受和預期的,不過…… 測試
上面的現象很奇怪,若是咱們當真要用x和y的時候,編譯器卻給予不一樣的對待,認爲x僅僅是沒有定義(承認已經聲明瞭),而y是真正的不存在。這說明在處理 一個範圍的變量的時候,var不管你在哪裏聲明的,老是一開始就進行分配了。對於非var定義的變量嘛,就沒有這樣的待遇了,必須等執行到才進行分配 this
1 |
<pre name="code" class="html">function fun1() { |
更須要注意的是,在函數內部聲明的var變量,並不侷限在聲明的代碼語句塊中,看看如下代碼
2 |
for (var i = 0; i < 10; i++) { |
因此呢,咱們推薦在一個對象/函數的第一行就把全部的局部變量所有聲明完畢
注意變量之間用逗號隔離,這樣的好處是明顯的,本身去考慮吧。
javaScript的語法很靈活,語句後面能夠不加;來表示結束,這個時候編譯器會講硬回車做爲語句的結束符合
以上的代碼寫法我不知道有什麼特別的好處,若是是炫耀你知道能夠不用;來結束語句,那就到此爲止吧。由於下面的代碼會獲得一個錯誤
由於javaScript會再return後面加一個;
正確的作法是
我很差說,這個緣由必定是;不寫引發的,但我想說明的是,你要當心javaScript對隨意代碼的隨意處理:你老是應該讓javaScript編譯器知道你明確的要幹嗎,而不是由他去猜呀猜的。