一、block块
{}表示一个块语句,并且在js中,没有块级作用域的概念
例如
for(var i=0;i<10;i++){}
此处看起来好像在for语句里定义了一个局部变量i,其实不然,在外部同样可以访问i
即上面的语句同 var i=0;for(;i<10;i++)
二、try{}catch(ex){}finally{}
其中try块里用来抛出异常,catch语句里用来捕获异常,finally则是,不管有没有出现异常,程序总是会去执行。该语句可以没有catch或者没有finally.
try{
throw 'test'
}catch(ex){
console.log(ex);//返回‘test’
}finally{
console.log('finally');
}
test
finally
注意,异常抛出后,总是会由里到外查找最近的catch语句处理,然后再执行finally
try{
try{
throw new Error('test');
}
finally{
console.log('inner finally');
}
}catch(ex){
console.log(ex.message);
}
inner finally
test
分析上面的代码,第一个外部的try语句里嵌套了另一个try语句,在内部try抛出错误,但是内部没有catch语句对错误进行处理,所以会先执行内部的finally{},接着,外部定义了一个catch语句,即所能找到的最近的catch语句,错误会在此处进行处理。所以上面的返回结果是inner finally test
三、for…in语句
var a;
var obj ={x:1,y:2,z:3}
for(a in obj){
}
使用for…in语句要十分注意:
其对数据的遍历顺序是不确定的; 若是对象的标签属性enumberable为false的话,不会遍历出来;其会把对象原型链上enumberable为true的属性也遍历出来。
四、严格模式
在整个js文件顶部声明”use strict”,或者在方法里的第一行声明‘use strict’
1、在严格模式中,不允许使用with语句;
2、arguments变为参数的静态副本
(function(a){
arguments[0] = 100;
console.log(a);
})(1)
//此处返回100,arguments的值的改变同样会影响到a的值
(function(a){
'use strict'
arguments[0] = 100;
console.log(a);
})(1)
//若是改为严格模式
//此处a仍然返回1,并不会受arguments值的改变的影响
(function(a){
'use strict'
arguments[0] = 100;
console.log(a);
})()
//返回undefined。注意,若是不传入a的值,不管是不是严格模式,这里即使改变了arguments[0]的值,也不会影响到a的值
(function(a){
'use strict'
arguments[0].x = 100;
console.log(a.x);
})()
这里我们要注意,不管是否是严格模式,如果传入参数是对象,arguments对对象的属性值做改变的话,会影响传入的对象的属性值
(function(a){
'use strict'
arguments[0].x = 100;
console.log(a.x);
})({x:1})
100