第三章:语句、严格模式
3-1 [Javascript] block语句、var语句
block语句(块语句):用一对花括号定义,用于组合0~多个语句。
注意:没有块级作用域,在块语句中定义的变量在外面也一样可以拿到并使用。但是在函数里定义的变量在外面是拿不到的(因为受函数作用域的影响,只能在该函数内部使用)。
var语句:主要用于给变量赋值。当给多个变量赋值时,注意中间要使用逗号隔开,不可直接使用等于符号连接,即推荐使用var a=1,b=1;不推荐使用var a=b=1;第二种是错误的给定义的变量赋值的方法。举例如图:
3-2 [Javascript] try-catch语句
try-catch提供了一个异常捕获的机制,执行流程为:try{}catch{}finally{}。先执行try块语句中的代码,如有异常抛出则由catch从句捕获并执行catch块语句中的代码(catch从句也是可以抛出异常的),无异常则跳过catch。不论是否有异常,最后都会执行finally块语句中的代码。
注意:try块语句后一定要搭配使用catch块语句或finally块语句或两者都使用。举一个嵌套使用try-catch的例子:
①首先执行第一个try,try里面有一个try-catch语句,②然后执行第二个try,二try抛出了一个名为oops的异常,③执行finall从句,打印了“你好”两个字,④执行catch从句中的代码,打印异常“outer”(随便写的)和获取到的异常的信息,即“oops”。所以最后打印出来的顺序及结果是“你好”(正常打印)、“outer”(打印为异常信息)、“oops”(打印为异常信息)。
再举一个例子:
try-catch语句中嵌套了一个try-catch-finally语句,打印顺序如图。因为在外部的try块语句中的try内部中抛出了异常且已经被内部catch捕获处理了,所以外部的catch就捕获不到异常,没有异常则外部的catch不会执行,打印也不会执行了。若有异常内部未处理,则外部会捕获,如下图:
还来一个例子:
内部的异常处理后,catch从句也抛出了一个异常,则会触发外部的catch从句,打印顺序如图。
3-3 [Javascript]函数 、switch、循环
function语句:①函数声明:function fun1(){};
②函数表达式:var fun2 = function(){};将一个匿名函数赋给fun2。
函数声明和函数表达式的区别:函数声明的函数(即fun1)可以先被调用,后进行声明;函数表达式的函数必须先进行匿名函数赋值才能进行调用。
另外还可以通过new function(){};(即构造器)这样的方式来创建函数对象。
for in语句:主要用于遍历。如:var p; var obj = {x:1,y:2} for(p in obj){} ;
注意:①遍历的顺序并不会按照数组中元素的顺序进行(顺序依赖于引擎的视线)。
②属性的enumerable(是对象中的每一个属性都有的属性描述器)为false时,for in不会遍历到该属性。
③for in的对象属性会受原型链影响。若对象(如举例中的obj)的原型链上有其他的属性且enumerable为true时,也会成为遍历对象(obj)当中的一个属性(若obj原型链上有一个z属性,假设值为3,且其enumerable为true,则实际上for in到的obj = {x:1,y:2,z:3})。
switch语句:条件分支语句之一。常与case、break、default搭配使用,举例讲解:
switch后的括号里是要进行判断的变量;case后面是与变量值进行对比的任意值;break代表若当前case的值与变量一致则跳出switch,否则继续执行;default表示不论是否有为true的case,都会执行的语句。
如第1个例子case 2时输出了2并跳出整个switch语句,故最后输出2;第2个例子没有break,故case 2时输出了2仍会继续进行,default中的语句也被执行了,故输出2,0;第3个例子表示满足case 1、2、3当中的一个时会输出123并跳出,否则继续执行,当满足case 4、5中的一个时会输出45,否则继续执行,最后执行default,会输出0,故最后输出123。
循环语句:while(判断语句)语句、do...while(判断语句)语句、for(i=0;判断语句;1++;)语句
with语句:可以修改当前的作用域,但不提倡使用。举例1:
举例2:当要查看document下的forms[0]下的name属性的值时,写法一:with(document.forms[0]){console.log(name.value)};写法二:var form = document.forms[0];首先通过定义一个变量来代替深层次访问的那些属性。console.log(form.name.value);
注意:在JS中现已经不建议使用with了,其缺点如下:①让JS引擎优化更难(with的作用域很复杂)②可读性差③可被变量定义代替(即举例2中的写法二)④严格模式下被禁用
3-4 [Javascript] 严格模式
严格模式是一种特殊的执行模式,修复了部分语言上的不足,提供了更强的错误检查,并增强了安全性。
进入严格模式的方法:①在使用严格模式的函数内部第一行写'use strict';如function fun(){'use strict';} 若某些浏览器不支持严格模式,'use strict';只会被当做一个普通的字符串,并不会影响程序的运行。
②在使用严格模式的js文件中,文件的第一句写'use strict';,即整个文件都在严格模式下运行。也可以不写在第一句,只要'use strict';这一句的前面没有定义变量或者写其他功能/逻辑性代码都可以。
严格模式与普通模式的区别:①不允许使用“with”语句。会报SyntaxError的错误,举例:
②不允许给未声明的变量被赋值。普通模式下的函数不声明变量直接给变量赋值的话相当于声明了一个全局变量并赋值(隐式创建全局变量)。而严格模式下则会报ReferenceError的错误,举例:
③arguments变为参数的静态副本。先举普通模式下函数的例子,定义一个函数且传参,则参数与arguments是有相互的绑定关系的(未传值时则没有):
严格模式下arguments与参数之间始终是没有关系的,即函数后的括号中传的值就是参数的值,例:
但是!!注意!!如果函数的参数是一个对象,若arguments改变了该对象的属性,那么arguments与参数之间就有了绑定关系,即该对象的属性是会随arguments的改变而改变的,例:
④delete参数、函数名报错。普通模式下的函数如果通过delete删除一个参数,则会返回false,不会报错;但在严格模式下,会报SyntaxError的错误,例:
同样,普通模式下的函数会忽略删除configurable标签为false的属性,会返回false,而严格模式下的函数使用delete不可配置的属性时不会忽略,会报TypeError的错误,例:
⑤对象字面量中重复的属性名会报错。在普通模式下的函数可以在对象的属性字面量中去重复定义一个属性或为其赋值等操作(这是合法的),函数会以最后一次的定义为准。但重复的属性名在严格模式下是会报SyntaxError错误的,例:
⑥禁止八进制字面量。普通模式下的函数可以使用数字表示八进制的值,但严格模式下会报SyntaxError的错误,例:
⑦eval、arguments变为了关键字,不能作为变量、函数名。普通模式下的函数可以在内部定义一个叫eval或arguments的局部函数;但严格模式下会报SyntaxError的错误,例:
⑧eval变为了独立作用域。即严格模式下的eval有独立的作用域,在eval外部是拿不到其里面的属性、值的,普通模式下可以,例:
其他注意的(自行学习和理解):



