现在的位置: 首页 > 综合 > 正文

js try、catch、finally语句还有with语句

2017年11月20日 ⁄ 综合 ⁄ 共 1091字 ⁄ 字号 评论关闭

差不多跟java是一样的,调用顺序是try,catch,finally,当然如果没抛到可以catch的异常,那么catch不会执行。finally语句里的内容是一定会被执行的,即便try里面有return或者break、continue。finally的内容会在return这三个东西之前调用。

一个比较有趣的用法是使用try跟finally,而不使用catch。因为这个用法不是用来抛异常的,执行机制显而易见。书中有个有趣的例子,是一个循环,它有可能会触发continue而跳出当次循环。但是我们可以使用finally来执行一些必须要执行的操作。不过它的用处不太清楚,感觉可以把循环语句优化一下也能做到。

with语句

java没这玩意吧。关于js中变量声明,其实呢,它是给一个对象声明了属性。但是这个过程对咱们是透明的。java关于作用域实现的机制就是它有一个叫调用对象的玩意。全局的变量其实就是全局调用对象的一个属性。局部变量就是局部调用对象的一个属性。然后呢,这些调用对象组成了一个链,比如咱执行到局部内容时,局部调用对象就排在全局调用对象的前头,那么当我声明一个局部变量时,就是给当前这个局部调用对象声明了一个同名属性。然后在这个局部调用对象中执行到了一个访问属性的语句,那么js会从这个作用域链,就是调用对象链里开始查找这个名字的变量,当然是从链子开头查咯。而局部的调用对象排在全局的前头,那么如果这个属性是局部属性,肯定在局部调用对象中查到了,然后呢下面的就不查了。如果没查到就继续查下面的。这样就实现了变量的作用域跟优先级。

这是我的粗俗理解。javascript权威指南第五版65页有详细的说明。

接下来正式进入with语句。

with(object) {statement}。它的意思是把object添加到作用域链的顶端。这个神奇了,这个object可以是随便什么object,并不一定要是那个透明的调用对象(调用对象咱能传进来么?我不清楚能不能)。然后呢,这个玩意的好处就是简化了代码量,又显得你很厉害。

比如咱要访问一个html表单里的元素,本来是这么写的: frames[1].document.forms[0].address.value,其实就是这个表单的address的值。但是这个名字也太长太长了。于是为了写的方便点,就这么用:

with( frames[1].document.forms[0]){

 name.value='';

address.value='';

email.value='';

}

这样就可以直接用表单的元素名来访问啦。因为是在forms[0]这个环境中。

抱歉!评论已关闭.