这里 {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,不绑定。
第三个,如果传递的是对象,修改对象的属性,就算是严格模式,依然相互影响。
正常模式下,相同的属性,后面会覆盖前一个。
网友评论