语句:javascrit程序由语句组成,语句遵守特定的语法规则。例如:if语句,while 语句,with语句
一、block 块
块语句常用于组合 0~多个语句。块语句用一对花括号定义
1、语法:
{
语句1;
语句2;
}
通常与 if 、while结合使用
if(true){
console.log("hi")
}
2、没有块级作用域
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 不可以访问
3、声明语句
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) 在一条语句中声明多个变量
var a =1 ,b =1;
二、try - catch 语句
1、 try -catch形式
- try -- catch
- try -- finally
- try --catch -- finally
try 后面一定要接一个catch() 或 finally
try{
throw "test";
}catch(ex){ //抛出异常时执行
console.log(ex); // test
}finally{ //最后一定会执行
console.log('finally')
}
2、 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);
}
finally
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语句
二、函数 switch,循环
1、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
}
2、 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
循环遍历对象属性
- 顺序不确定。具体顺序依赖于引擎实现
- 属描述器,eneumerable 为 false 时 不会出现
- for in对象 属性 受原型链影响,如果 obj原型链上的原型,拥有的其他属性,eneumerable为true时也会出现
3、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;
}
3、with
with语句可以修改当前作用域(不建议使用)
with({x:1}){
console.log(x);
}
//在with语句中可以直接使用 x输出1,不用对象.x
三、严格模式
严格模式是一种特殊的执行模式,它修复了部分语言上的不足,提供了更强的错误检查,并增强安全性
1、使用方法
function func(){
'use strict'; //严格模式
}
或可以在js文件前使用 'use strict' ,整个文件严格模式
2、严格模式下要求
- 不允许用 with
- 不允许未声明的变量被赋值。 报错 ReferenceError
- arguments 变为参数的静态副本
- delete 参数 、函数名 报错 syntaxError(语法错误)
- delete 不可配置属性 :configurable :false 报错 TypeError
- 对象字面量重复属性名报错 var obj = { x:1 , x:2}报错 syntaxError(语法错误)
- 禁止八进制自变量普通模式下 console.log(0123) ---83, 严格模式下报错 syntaxError(语法错误)
- eval ,arguments 变为关键字,不能作为变量、函数名syntaxError(语法错误)
- eval变为独立作用域