HTML5开发爱心鱼游戏系列第一部分、js深入浅出(第三章)

2017-12-06  本文已影响40人  留白_汉服vs插画

这里 {a:1,b:2} ,以左括号开始,会被理解成一个块,而不是对象字面量,所以报错。

需要注意的是没有块级的作用域。

实际上,块里面定义变量,和在外面定义一样,其他都能访问的。

如果是在函数中定义的话,有函数作用域,函数外面是拿不到的。

一个很有意思的现象,用第二个定义的时候,确实有a,b都是1,但是a在函数中被声明了,所以函数外面是无法访问的。a是局部变量,b是全局变量。这里var a=b=1,b并没有被var,作用域在函数外面。那么怎样在函数中声明a,b?使用第三个。

try catch 提供了一个异常捕获的机制,首先执行try块中的代码,如果抛出异常,让catch捕获,并执行。没有异常,catch中语句会被忽略。不管有没有异常,最后执行finally。

有三种使用方法,try-catch,try-catch-finally,try-finally

try/catch/finally语句是常见的异常处理机制。其中try从句定义了需要处理的异常所在的代码块。catch紧跟try之后,当try块内某处发生了异常时,调用catch内的代码逻辑。catch从句之后跟随finally块,后者中放置清理代码,不管try块中是否产生异常,finally块内的逻辑总是会执行。

throw 语句允许我们创建自定义错误。

正确的技术术语是:创建或抛出异常(exception)。如果把 throw 与 try 和 catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。

看一下嵌套使用的:

这里的throw是自定义的抛出异常,也就是错误。catch捕获这个错误,所以执行过程为:执行外围try,然后新定义一个“抛出异常为opps” ,但这个时候,并没有抛出,需要注意啊。然后执行答应finally,catch捕获异常,打印outer和ex.message。这里的ex.message就是自定义的异常“oops” 。

这是分析这个输出什么:先执行外层try,然后定义一个新的异常oops,捕获新定义的异常,输出inner,和oops,接着执行finally中内容,输出finally。最后外层的catch,因为异常已经处理过了,不需要再处理了,所以不执行了。

所以输出为:inner oops 

                      finally 

分析:定义一个异常,首先输出异常inner oops,接着重新定义一个抛出异常ex,最后输出finally。继续捕获异常,输出outer oops

答案为: inner oops

                finally

                outer oops

里面的catch抛出异常,外面catch执行之前,要先执行里面的finally语句。

前一个函数声明 后一个函数表达式。

函数声明会提前,但是函数表达式不可以的。

with 可以改变作用域。比如第一个,意思就是在对象作用域{x:1} 下面,直接输出x,而不用对象.x 

第二个是在document.forms[0] 下面访问name.value属性,而不用document.forms[0].name.value。

但是在深层访问的时候,不是很建议这么用。可读性比较差。使用第三种,直接给节点一个声明form,使用form.name.value会更好。

严格模式向上兼容,如果不支持严格模式,就当初一个普通的字符串。

上面两种使用方法,一在函数内使用严格模式,二放在js头,这个文件都是严格模式。

严格模式的区别:

没有声明就使用,在一般模式下,会当成一个全局变量,严格模式下会报错。

第一个,传递参数1之后,a为1。非严格模式下,arguments和a绑定的。所以输出100,但是如果不传递参数1,a依然是undefined,不会受argument影响。

第二个,严格模式下,不管有没有参数,都不影响。传递参数1,a就是1,不绑定。

第三个,如果传递的是对象,修改对象的属性,就算是严格模式,依然相互影响。

正常模式下,相同的属性,后面会覆盖前一个。

上一篇 下一篇

猜你喜欢

热点阅读