block块
block块语句常用于组合0~多个语句。用一对花括号定义。
语法:
{
语句1;
语句2;
...;
语句n;
}
没有块级的作用域
如
{
var i=10;
}
这两者效果是一样的
var i = 10;
{
...
}
console.log(i); //仍然可以访问的到
但是有函数作用域、全局作用域
function a(){
var i = 10;
}
console.log(i); //undefined
但是
function foo(){
var a = b = 1;
}
foo();
console.log(typeof a); //undefined
console.log(typeof b); //number
此时b 成为了全局变量,但是
console.log(b); //又是null
try catch
try{
throw "test";
}catch (ex){
console.log(ex); //捕获try抛出的异常
}finally {
console.log("finally"); //无论是否捕获到异常,均会执行finally的代码块
}
try catch 的嵌套语句
当内部的try抛出异常时,
1、如果内部没有catch语句捕获异常,将该异常继续向上级抛出
2、如果内部有catch语句捕获异常时,该异常被内部catch处理,不会再继续抛出
function switch 循环
function
function fd(){ //函数声明
//do sth
return true;
}
var fe = function(){ //函数表达式
//do sth
};
//函数声明会被预先处理(函数前置)
在函数声明前面调用函数也是可行的,但是函数表达式就不行
fd(); //true
function fd(){
//do sth
return true;
}
fe(); //TypeError
var fe = function(){
//do sth
};
for..in
var p;
var obj = {x:1,y:2};
for(p in obj){
console.log(p + " : " + obj[p] );
}
switch
跟其他的一样一样的
循环
一样一样的
with 不建议使用with,使作用域复杂,影响引擎优化,影响可读性
with({x:1}){
console.log(x); //相当于{x:1}.x;
}
with(document.forms[0]){
console.log(name.value); //相当于document.forms[0].name.value;
}
严格模式
严格模式是一种特殊的执行模式,它修复了部分语言上的不足,提供更强的错误检查,并增强安全性
1.不允许使用with
2.不允许未声明的变量被赋值
3.arguments变为参数的静态副本
4.delete参数、函数名报错
5.delete不可配置的属性报错
6.对象自变量重复属性名报错
7.禁止八进制自变量
8.eval,arguments变为关键字,不能作为变量或函数名
!function(a){
arguments[0] = 100; //修改第一个argument为100,即a
document.write(a); //从1 修改为 100
}(1);
在严格模式下,argument变为静态副本,任意修改都不会影响参数的值
!function(a){
'use strict';
arguments[0] = 100; //修改第一个argument为100,即a
document.write(a); //仍然为1
}(1);
但是如果传入的是个对象,arguments可修改对象的属性
!function(a){
'use strict';
arguments[0].x = 100; //修改a的属性x从1到100
document.write(a.x); //变为100
}({x:1});
function func(){
'use strict'
}
或
'use strict'
function func(){
}
!function(){
var obj = {x:1,x:2}; //取最后一个值
console.log(obj.x);
}();
!function(){
'use strict';
var obj = {x:1,x:2}; //严格模式下报错 SyntaxError
console.log(obj.x);
}();