原 2017/5 JavaScript基礎5--- 語句、嚴格模式

語句:javascrit程序由語句組成,語句遵照特定的語法規則。例如:if語句,while 語句,with語句javascript

1、block 塊

塊語句經常使用於組合 0~多個語句。塊語句用一對花括號定義java

一、語法:

{
   語句1; 
   語句2;
}

一般與 if 、while結合使用安全

if(true){
  console.log("hi")
}

二、沒有塊級做用域

1)在for循環完成以後,在外面一樣也能夠訪問。

for(var i =0 ; i<10 ; i++){  //i雖然聲明在for裏面但在外面也能夠訪問
   var str = "hi";
   console.log(str);
}
var i=0;
for( ; i<10;i++){
  var str = "hi";
  console.log(str);
}
//此種寫法同上面做用相同

2)函數做用域

function foo(){
  var a = 1;
  console.log(a); //1
}

foo();
console.log( typeof a) ; //undefined 不能夠訪問

三、聲明語句

1)var  a = b =1;

當使用  var  a = b =1; 確實建立了兩個變量並一個且賦值爲1,可是 b 是隱式的建立了全局變量。函數

function foo(){
  var a = b = 1;  
} 

foo();
console.log(typeof a) ; //"undefined"
consloe.log(typeof b) ; // number  b爲全局變量

2) 在一條語句中聲明多個變量oop

var a =1 ,b =1;spa

2、try - catch 語句

一、 try -catch形式

  1. try  -- catch
  2. try -- finally
  3. try --catch -- finally

try 後面必定要接一個catch() 或 finallycode

try{
  throw "test";
}catch(ex){  //拋出異常時執行
  console.log(ex); // test
}finally{  //最後必定會執行
  console.log('finally')
}

二、 try -catch 嵌套

1)嵌套1

try2 拋出一個異常  "opps",在try2 裏面沒有catch,因此會跳出尋找最近的catch,但會先執行finally對象

try{
/************try2***************/
  try{
      throw new Error("opps");
  }finally{
      console.log("finally");
  }
/*****************************/

}catch(ex){
  console.error("outer" , ex.message);
}

finallyip

outer opps原型鏈

2)嵌套2

try{
/************try2****************/
  try{
    throw new Error("oops");
  }catch(ex){
    console.error("inner",ex.message);
  }finally{
    console.log("finally)
  }

/************try2****************/

}catch(ex){
  console.error("outer" , ex.message);
}

裏面拋出一個異常,在裏面直接處理

inner  oops

finally

若是裏面的異常沒有處理拋出了,則在外部處理異常以前,會先處理內部 finally語句

2、函數 switch,循環

一、function

1) 函數聲明:

function fd(){
  //do sth
  return
}

2) 函數表達式:

var fe = function(){
  //do sth
 
}

3)區別

函數聲明會被預先處理,函數前置

//正確
fd()
function fd(){
  //do sth
  return
}

函數表達式不能夠在聲明前調用

//錯誤
fe(); TypeError
var fe = function(){
  //do sth
 
}

二、 for ... in語句 

var p;
var obj = { x: 1, y:2}

for(p in obj){}
var obj = {a:1,b:2,c:3}
for( var prop in obj){
console.log("obj." + prop + "=" +obj[prop])
}

/*********Output************/
obj.a=1
obj.b=2
obj.c=3

循環遍歷對象屬性 

  1. 順序不肯定。具體順序依賴於引擎實現
  2. 屬描述器,eneumerable 爲 false 時 不會出現
  3. for in對象  屬性 受原型鏈影響,若是 obj原型鏈上的原型,擁有的其餘屬性,eneumerable爲true時也會出現

三、switch  

var val = 2;
switch(val){
  case 1:
   console.log(1); break;
  case 2:
   console.log(2); break;
  default:
   console.log(0); break;
}

結果輸出2

也能夠多個條件執行一個語句

var val = 2;
switch(val){
  case 1:
  case 2:
   console.log(1,2); break;
  default:
   console.log(0); break;
}

 三、with

with語句能夠修改當前做用域(不建議使用)

with({x:1}){
  console.log(x);
}

//在with語句中能夠直接使用 x輸出1,不用對象.x

3、嚴格模式

嚴格模式是一種特殊的執行模式,它修復了部分語言上的不足,提供了更強的錯誤檢查,並加強安全性

一、使用方法

function func(){
  'use strict'; //嚴格模式
}

或能夠在js文件前使用  'use strict' ,整個文件嚴格模式

二、嚴格模式下要求

  1. 不容許用 with 
  2. 不容許未聲明的變量被賦值。 報錯 ReferenceError
  3. arguments 變爲參數的靜態副本
  4. delete 參數 、函數名 報錯 syntaxError(語法錯誤)
  5. delete 不可配置屬性 :configurable :false 報錯 TypeError
  6. 對象字面量重複屬性名報錯 var obj = { x:1 , x:2}報錯 syntaxError(語法錯誤)
  7. 禁止八進制自變量普通模式下 console.log(0123) ---83, 嚴格模式下報錯 syntaxError(語法錯誤)
  8. eval ,arguments 變爲關鍵字,不能做爲變量、函數名syntaxError(語法錯誤)
  9. eval變爲獨立做用域
相關文章
相關標籤/搜索