首頁  >  文章  >  web前端  >  JavaScript高階程式設計(第3版)學習筆記2 js基礎語法_基礎知識

JavaScript高階程式設計(第3版)學習筆記2 js基礎語法_基礎知識

WBOY
WBOY原創
2016-05-16 17:49:181055瀏覽

這篇複習一下ECMAScript規範中的基礎語法,英文好的朋友可以直接閱讀官方文件。 JavaScript本質上也是一種類C語言,熟悉C語言的朋友,可以非常輕鬆的閱讀這篇文章,甚至都可以跳過,不過建議你最好還是看一看,在介紹的同時,我可能會引用一些自認為不易理解且比較流行的用法。

基礎語法

1、標識符:所謂標識符,實際上就是指一個滿足某一規範,能夠被引擎識別的名字,可以用來表示常數、變數、函數名、函數參數、物件、物件屬性等所有可命名對象的名稱。

(1)區分大小寫。

(2)以字母、底線(_)或美元符號($)開頭,其它字元可以為字母、底線、美元符號或數字。這裡的字母包含擴充的ASCII或Unicode字元。

(3)標識符不能是關鍵字、保留字、true、false、null。 (有些瀏覽器允許使用undefined,有些不能)。

(4)如果物件屬性含有空格或其它特殊字符,可以用括號括起來作為一個整體。

2、關鍵字:在語言本身有特定用途。

    break  case  catch  continue  debugger(ES5中新增)  差  if  in  instanceof  new  return  switch  this  throw  try  『

3、保留字:被語言本身保留,將來可能會作為關鍵字。

  ES3中的保留字:

    

abstract  boolean  byte  char  class  const  debugger  行 n  const  debugger 四 float  goto  implements  import  int  interface  long  native  package  publicvate 腳 native  package 甀private 腳材 銫 tec synchronized  throws  transient  volatile

  ES5中的非嚴格模式下的保留字:

    

class  const  enum  export  extends  import  ner

  ES5的嚴格模式下的保留字:

    

implements  interface  let(ES5中新增)  package  private  pro產品  4、嚴格模式:在ES5中引入嚴格模式,透過使用"use strict"來開啟嚴格模式,可以在頂部開啟全域嚴格模式,也可以在函數作用域範圍內開啟局部嚴格模式。


複製程式碼

程式碼如下: "use strict"//開啟全域全域嚴格模式,在ES3中,不會有任何影響function fn(){   "use strict"//開啟局部嚴格模式
}


5、註解:在ECMAScript中,支援兩種格式的註釋,單行註解與區塊級註解:



複製程式碼
程式碼如下: 程式碼如下:


程式碼如下:

/🎜> / 單行註釋,以兩個斜杠//開頭/*
* 多行(塊級)註釋,以一個斜杠/和一個星號*開頭,一個星號和一個斜杠結尾,這里中間行的星號*不是必須的
*/


說明:隨著JS程式碼越來越複雜,註解也變的越來越重要,而文件自動化也顯得愈加重要,目前已經有很多開源JS函式庫用來自動化產生類似Javadoc的JS文檔,像是JSDoc、YUIDoc等,這個時候,對註解也會有相應的格式要求,有興趣的朋友可以找相關資料研究。
複製代碼


代碼如下:
var age = 29; age = '>age = ' ';  //雖然有這種彈性,但我建議你除非明確知道自己在做什麼,否則別這樣做。
(2)var操作符:變數使用var來聲明,對於未初始化的變量,會預設為undefined,也可以直接使用變數而不聲明(在我看來,這同樣是一個沒有存在理由的特性),它們之間最重要的區別是使用var聲明時,聲明的變數只在當前作用域有效,而不使用var時,變數就會定義在全域作用域。可以通過下面的例子來體會其中的區別:
複製代碼 代碼如下:

var name = 'linjisong'; //定義全域變數並賦值
age = 29; //直接使用變量,相當於定義全域變數並賦值
//sal; //錯誤
var salary; / /定義全域變量,未初始化
//這裡只是函數聲明,沒有實際調用,所以內部定義的變數不會生效
function fn(){
var name = 'oulinhai';//定義局部變數並賦值
age = 23; //給全域變數賦值
work = 'it';      //沒有使用var,即使是在函數局部的變量,也會成為全域變數
}
//函數實際呼叫前
console.info(salary);   //undefined
console.info(name);   // linjisong
console.info(age); // 29
try{
console.info(work);//由於在全域環境中沒有定義work,這裡會拋出異常
}catch(e){}
fn();//實際調用,程式碼中變數的變更會顯現出來
console.info(name); // linjisong,由於函數內部使用了var,所以不會改變全域的name值
console.info(age); // 23
console.info(work); // it

(3)宣告提升:這個問題在講函數宣告和函數表達式時還會再談到,這裡先提一下,看程式碼:
複製程式碼 程式碼如下:

console.info(name); /undefined
console.info(getName);//getName()函數
console.info(getName());//undefined
try{
console.info(age);//異常
}catch(e){
console.info(e);//ReferenceError
}
console.info(getAge);//undefined
try{
console. info(getAge());//異常
}catch(e){
console.info(e);//TypeError
}
var name = 'linjisong';//變數聲明,提升
age = 29;//直接使用全域變量,不提升
function getName(){//函數聲明,提升
return name;
}
var getAge = function( ){//變數getAge的聲明,提升;取得年齡的匿名函數表達式,不提升
return age;
}
console.info(name);//linjisong
console.info (getName);//getName()函數
console.info(getName());//linjisong
console.info(age);//29
console.info(getAge);//取得年齡的匿名函數
console.info(getAge());//29

你有沒有自己推論出上面的輸出結果?如果已經推斷出,可以跳過了,如果還存有疑問,那麼先看看下面關於聲明提升的描述,然後再回過頭來印證上面的輸出結果:
    A、引擎在解析時,首先會解析函數聲明,然後解析變數宣告(解析時不會覆寫型別),最後再執行程式碼;
    B、解析函數宣告時,會同時解析型別(函數),但不會執行,解析變數宣告時,只解析變數,不會初始化。
  這裡涉及的只是全域作用域,在函數作用域中還有函數參數也和宣告提升有關,在後面講述函數時再討論。
  上面的程式碼,首先會把第18行的函數宣告和第16、21行的變數宣告提升到最開始解析,然後再執行。因此第1、9行因為變數宣告提升但尚未初始化,所以輸出undefined,從而第11行因為無法確定是函數類型而拋出類型異常;第2、3行因為函數宣告提升且解析函數類型,所以第2行輸出函數,第3行可以呼叫函數,但傳回值未初始化而輸出undefined;第5行因為尚未宣告變數,會拋出引用例外。
(4)可以使用一條語句定義多個變量,用逗號分開即可。如:
複製程式碼 程式碼如下:

var name='linjisong' age=29,
work='it';


(5)在ES5的嚴格模式下,無法定義名為eval或arguments的變數。
7、語句
(1)語句:以一個分號「;」結尾,如果省略分號,由解析器決定語句的結尾。
  對於JS中語句可以省略分號的特性,我想不到任何存在的理由,強烈建議每條語句均使用分號來明確結束,不要讓解析器花費時間來「猜測」你的程序,而且,更重要的是,在許多壓縮工具中,猜測並不能保證百分之百的正確。
(2)代碼區塊:以左花括號({)開始,右花括號(})結束。
  在JS中雖然有程式碼區塊的概念,但是卻沒有對應的區塊級作用域,這是和一般類別C語言所不同的。對於控制語句(例如if),不要因為只有一條語句就不使用程式碼區塊,這會給維護你程式的伙計種下犯錯的種子。
複製程式碼 程式碼如下:

for(var i=0; i{
}
console.info(i);//輸出10,在程式碼區塊之後仍可以存取i,說明JS無區塊級作用域
if(i //console.info(i); 不使用程式碼區塊,在維護時(例如新增1條語句)容易犯錯
{
console.info(i);
}

 花括號({})除了作為程式碼區塊來使用外,還有一個很重要的用處就是定義物件字面量,這在後面還會再有論述。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn