JavaScript特點

JavaScript是一種動態解釋型語言,這使得它和傳統的編譯型語言有着一些區別。這些區別引發出某些獨特的概念和使用方法,簡單舉例說明。


在我的理解裏,這些特點分別有:解釋執行、弱類型、面向過程與面向對象相結合、瀏覽器相關性
一、
解釋執行導致一個在編寫代碼時需要留意的方面——執行結果和語句的順序有很大相關性:
比如:
1.script語句寫在了某些html元素之前,而試圖去操作這些元素,那麼是不能成功的;


2.聲明寫在使用之後是不行的,而在編譯型語言裏編譯時的語序影響通常不大,因爲還沒到執行時刻
比如在java中,這樣是可以的:
private String test(){
return this.name;
}
private String name;


JavaScript中這樣是不行的:


(function test(){
alert(name);
})();
name="aaa";


3.在函數裏定義一個全局變量,那麼在這個函數沒有執行之前,引用這個變量是不能成功的(儘管函數語句在變量引用之前)
function f1(){
test = 10;
}
f1(); //函數必須先執行過,下面的引用才能成功
alert(test);


二、弱類型
JavaScript雖然也定義了Undefined、Null、Boolean、Number、String、Object六種數據類型,但屬於弱類型語言,對於變量的使用和類型轉換並不嚴格,所以經常有一些看似奇怪的語法。比如:
var num=5;
num="hello";
alert(num);


對函數調用時,參數類型和個數也沒有要求:
function add(a,b){
return a+b;
}
alert(add(1,"2","hi",false));  //也沒有問題


三、面向過程與面向對象相結合
可以象面向過程語言那樣定義和調用函數,如:
function add(a,b){
return a+b;
}
add(1,2);
這是面向過程語言的特徵。
同時函數可以作爲一個對象/變量,如:
var add=function(a,b){
return a+b;
}
add(1,2);


常規語言裏,對象意味着屬性與方法的集合。屬性與方法是有區別的。屬性是數據,方法是動作(當然屬性值可以是別的對象)。那麼既然JavaScript函數可以成爲對象,自然也可以作爲屬性值。所以實際上在JavaScript裏,屬性和方法是沒區別的。於是統稱爲名稱:屬性,這樣類似key-value的樣式。


除了屬性值可以採用函數,函數的參數、返回值也可以是函數。這種把函數作爲參數或返回值帶來一個比較糾結的問題————如果用變量把作爲返回值的函數保存起來,那麼這個函數隨時執行應該沒問題吧。問題是這個函數作爲那個函數的返回值,它可能引用了那個函數裏的某些東西。隨時調用這個函數也就意味着包裹着它的那個外層函數也必須時時被保存,不能被釋放。那這就是閉包了。有點繞嘴,看個例子:
function fout(){
var n=123;
return function fin(){
alert(n); //123
}
}
var f=fout();
f();


//儘管fout已經執行完成,但返回值被f保存起來,於是fout也不能被釋放,裏面的所有內容包括局部變量n也一直不能被釋放,因爲隨時可能被f用到


閉包是其他語言裏不具備的,就是因爲JavaScript這種“函數是對象,對象是函數”繞出來的。


此處還可參考:《JavaScript作用域、上下文環境、函數對象的定義與調用、匿名函數的定義與調用、閉包》


四、
此外由於各個瀏覽器的實現細節有所差別,所以JavaScript在不同的瀏覽器中執行結果會有差異,這也是需要在使用中注意的。


比如:
function(event){
event.target.style.color="";
}
這是一個常見的事件處理函數,在firefox裏必須要加上event參數,而在ie和chrome裏則可以省略
再比如:
switch (event.type){
case "click":
errorMethod();
alert("click button");
break;
case "mouseover":
event.target.style.backgroundColor="green";
break;
}
當其中一個case出現錯誤調用,firefox會認爲整個事件處理函數都是錯誤的,拒絕執行。而在ie中則僅僅是錯誤的case不能執行,正確的case依舊會執行。


簡單總結一下學習過程中遇到的思考點和迷惑點,總之JavaScript還是滿有趣和強大的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章