最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記2 js基礎(chǔ)語(yǔ)法

 更新時(shí)間:2012年10月11日 02:16:10   作者:  
這一篇復(fù)習(xí)一下ECMAScript規(guī)范中的基礎(chǔ)語(yǔ)法,英文好的朋友可以直接閱讀官方文檔。JavaScript本質(zhì)上也是一種類C語(yǔ)言,熟悉C語(yǔ)言的朋友,可以非常輕松的閱讀這篇文章,甚至都可以跳過(guò),不過(guò)建議你最好還是看一看,在介紹的同時(shí),我可能會(huì)引用一些自認(rèn)為不易理解且比較流行的用法。
這一篇復(fù)習(xí)一下ECMAScript規(guī)范中的基礎(chǔ)語(yǔ)法,英文好的朋友可以直接閱讀官方文檔。JavaScript本質(zhì)上也是一種類C語(yǔ)言,熟悉C語(yǔ)言的朋友,可以非常輕松的閱讀這篇文章,甚至都可以跳過(guò),不過(guò)建議你最好還是看一看,在介紹的同時(shí),我可能會(huì)引用一些自認(rèn)為不易理解且比較流行的用法。

基礎(chǔ)語(yǔ)法

1、標(biāo)識(shí)符:所謂標(biāo)識(shí)符,實(shí)際上就是指一個(gè)滿足一定規(guī)范,能夠被引擎識(shí)別的名字,可以用來(lái)表示常量、變量、函數(shù)名、函數(shù)參數(shù)、對(duì)象、對(duì)象屬性等所有可命名對(duì)象的名稱。

(1)區(qū)分大小寫(xiě)。

(2)以字母、下劃線(_)或美元符號(hào)($)開(kāi)頭,其它字符可以為字母、下劃線、美元符號(hào)或數(shù)字。這里的字母包含擴(kuò)展的ASCII或Unicode字符。

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

(4)如果對(duì)象屬性含有空格或其它特殊字符,可以用括號(hào)括起來(lái)作為一個(gè)整體。

2、關(guān)鍵字:在語(yǔ)言本身中有特定用途。

    break  case  catch  continue  debugger(ES5中新增)  default  delete  do  else  finally  for  function  if  in  instanceof  new  return  switch  this  throw  try  typeof  var  void  while  with

3、保留字:被語(yǔ)言本身保留,將來(lái)可能作為關(guān)鍵字。

  ES3中的保留字:

    abstract  boolean  byte  char  class  const  debugger  double  enum  export  extends  final  float  goto  implements  import  int  interface  long  native  package  private  protected  public  short  static  super  synchronized  throws  transient  volatile

  ES5中的非嚴(yán)格模式下的保留字:

    class  const  enum  export  extends  import  super

  ES5的嚴(yán)格模式下的保留字:

    implements  interface  let(ES5中新增)  package  private  protected  public  static  yield(ES5中新增)

 4、嚴(yán)格模式:在ES5中引入嚴(yán)格模式,通過(guò)使用"use strict"來(lái)開(kāi)啟嚴(yán)格模式,可以在頂部開(kāi)啟全局嚴(yán)格模式,也可以在函數(shù)作用域范圍內(nèi)開(kāi)啟局部嚴(yán)格模式。

復(fù)制代碼 代碼如下:

"use strict"http://開(kāi)啟全局嚴(yán)格模式,在ES3中,不會(huì)有任何影響function fn(){
  "use strict"http://開(kāi)啟局部嚴(yán)格模式
}

5、注釋:在ECMAScript中,支持兩種格式的注釋,單行注釋和塊級(jí)注釋:
復(fù)制代碼 代碼如下:

// 單行注釋,以兩個(gè)斜杠//開(kāi)頭/*
* 多行(塊級(jí))注釋,以一個(gè)斜杠/和一個(gè)星號(hào)*開(kāi)頭,一個(gè)星號(hào)和一個(gè)斜杠結(jié)尾,這里中間行的星號(hào)*不是必須的
*/

說(shuō)明:隨著JS代碼越來(lái)越復(fù)雜,注釋也變的越來(lái)越重要,而文檔自動(dòng)化也顯得愈加重要,目前已經(jīng)有很多開(kāi)源JS庫(kù)用于自動(dòng)化生成類似于Javadoc的JS文檔,比如JSDoc、YUIDoc等,這個(gè)時(shí)候,對(duì)注釋也會(huì)有相應(yīng)的格式要求,有興趣的朋友可以找相關(guān)資料研究。

6、變量:變量在其本質(zhì)上不過(guò)是內(nèi)存空間在語(yǔ)言級(jí)別的外在抽象。

(1)動(dòng)態(tài)類型:在ECMAScript中,變量是動(dòng)態(tài)類型的,你可以在定義的時(shí)候初始化為一個(gè)Number類型,緊接著,你可以把一個(gè)字符串值賦給它:
復(fù)制代碼 代碼如下:

var age = 29;
age = 'twenty-nine';  //雖然有這種靈活性,但我建議你除非明確知道自己在做什么,否則別這樣做。

(2)var操作符:變量使用var來(lái)聲明,對(duì)于未初始化的變量,會(huì)默認(rèn)為undefined,也可以直接使用變量而不聲明(在我看來(lái),這同樣是一個(gè)沒(méi)有存在理由的特性),它們之間最重要的區(qū)別就是使用var聲明時(shí),聲明的變量只在當(dāng)前作用域有效,而不使用var時(shí),變量就會(huì)定義在全局作用域??梢酝ㄟ^(guò)下面的例子來(lái)體會(huì)其中的區(qū)別:
復(fù)制代碼 代碼如下:

var name = 'linjisong'; //定義全局變量并賦值
age = 29; //直接使用變量,相當(dāng)于定義全局變量并賦值
//sal; //錯(cuò)誤
var salary; //定義全局變量,未初始化
//這里只是函數(shù)聲明,沒(méi)有實(shí)際調(diào)用,所以內(nèi)部定義的變量不會(huì)生效
function fn(){
var name = 'oulinhai';//定義局部變量并賦值
age = 23; //給全局變量賦值
work = 'it';      //沒(méi)有使用var,即便是在函數(shù)局部的變量,也會(huì)成為全局變量
}
//函數(shù)實(shí)際調(diào)用前
console.info(salary);   //undefined
console.info(name);   // linjisong
console.info(age); // 29
try{
console.info(work);//由于在全局環(huán)境中沒(méi)有定義work,這里會(huì)拋出異常
}catch(e){}
fn();//實(shí)際調(diào)用,代碼中對(duì)于變量的變更會(huì)顯現(xiàn)出來(lái)
console.info(name); // linjisong,由于函數(shù)內(nèi)部使用了var,所以不會(huì)更改全局的name值
console.info(age); // 23
console.info(work); // it

(3)聲明提升:這個(gè)問(wèn)題在講函數(shù)聲明和函數(shù)表達(dá)式時(shí)還會(huì)再次談到,這里先提一下,看代碼:
復(fù)制代碼 代碼如下:

console.info(name);//undefined
console.info(getName);//getName()函數(shù)
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(){//函數(shù)聲明,提升
return name;
}
var getAge = function(){//變量getAge的聲明,提升;獲取年齡的匿名函數(shù)表達(dá)式,不提升
return age;
}
console.info(name);//linjisong
console.info(getName);//getName()函數(shù)
console.info(getName());//linjisong
console.info(age);//29
console.info(getAge);//獲取年齡的匿名函數(shù)
console.info(getAge());//29

你有沒(méi)有自己推斷出上面的輸出結(jié)果?如果已經(jīng)推斷出,可以跳過(guò)了,如果還存有疑問(wèn),那么先看看下面關(guān)于聲明提升的描述,然后再回過(guò)頭來(lái)印證上面的輸出結(jié)果:
    A、引擎在解析時(shí),首先會(huì)解析函數(shù)聲明,然后解析變量聲明(解析時(shí)不會(huì)覆蓋類型),最后再執(zhí)行代碼;
    B、解析函數(shù)聲明時(shí),會(huì)同時(shí)解析類型(函數(shù)),但不會(huì)執(zhí)行,解析變量聲明時(shí),只解析變量,不會(huì)初始化。
  這里涉及的只是全局作用域,在函數(shù)作用域中還有函數(shù)參數(shù)也和聲明提升有關(guān),在后面講述函數(shù)時(shí)再討論。
  上面的代碼,首先會(huì)把第18行的函數(shù)聲明和第16、21行的變量聲明提升到最開(kāi)始解析,然后再執(zhí)行。因此第1、9行因?yàn)樽兞柯暶魈嵘形闯跏蓟?,所以輸出undefined,從而第11行因?yàn)闊o(wú)法確定是函數(shù)類型而拋出類型異常;第2、3行因?yàn)楹瘮?shù)聲明提升并且解析函數(shù)類型,所以第2行輸出函數(shù),第3行可以調(diào)用函數(shù),但返回值未初始化而輸出undefined;第5行因?yàn)樯形绰暶髯兞?,?huì)拋出引用異常。
(4)可以使用一條語(yǔ)句定義多個(gè)變量,用逗號(hào)分開(kāi)即可。如:
復(fù)制代碼 代碼如下:

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

(5)在ES5的嚴(yán)格模式下,不能定義名為eval或arguments的變量。
7、語(yǔ)句
(1)語(yǔ)句:以一個(gè)分號(hào)“;”結(jié)尾,如果省略分號(hào),由解析器確定語(yǔ)句的結(jié)尾。
  對(duì)于JS中語(yǔ)句可以省略分號(hào)的特性,我想不到任何存在的理由,強(qiáng)烈建議每條語(yǔ)句均使用分號(hào)來(lái)明確結(jié)束,不要讓解析器花費(fèi)時(shí)間來(lái)“猜測(cè)”你的程序,而且,更加重要的是,在很多壓縮工具中,猜測(cè)并不能保證百分百的正確。
(2)代碼塊:以左花括號(hào)({)開(kāi)始,右花括號(hào)(})結(jié)束。
  在JS中雖然有代碼塊的概念,但是卻沒(méi)有相應(yīng)的塊級(jí)作用域,這是和一般類C語(yǔ)言所不同的。對(duì)于控制語(yǔ)句(比如if),不要因?yàn)橹挥幸粭l語(yǔ)句就不使用代碼塊,這會(huì)給維護(hù)你程序的伙計(jì)種下犯錯(cuò)的種子。
復(fù)制代碼 代碼如下:

for(var i=0; i<10; i++)
{
}
console.info(i);//輸出10,在代碼塊之后仍可以訪問(wèn)i,說(shuō)明JS無(wú)塊級(jí)作用域
if(i < 10)
//console.info(i); 不使用代碼塊,在維護(hù)時(shí)(比如添加1條語(yǔ)句)容易犯錯(cuò)
{
console.info(i);
}

 花括號(hào)({})除了作為代碼塊來(lái)使用外,還有一個(gè)很重要的用處就是定義對(duì)象字面量,這在后面還會(huì)再有論述。

相關(guān)文章

最新評(píng)論

平阴县| 阳江市| 达日县| 靖宇县| 敦煌市| 观塘区| 嘉义县| 富源县| 南安市| 马尔康县| 建瓯市| 新竹县| 黑龙江省| 大方县| 锡林郭勒盟| 红安县| 辽宁省| 长寿区| 景谷| 阳泉市| 砀山县| 天门市| 定边县| 连江县| 连平县| 衡东县| 肃宁县| 乌兰浩特市| 乐昌市| 于都县| 阜阳市| 滨州市| 永泰县| 静安区| 从化市| 平阴县| 五原县| 清原| 潼关县| 南溪县| 河南省|