标签:rip exp 对象引用 注意 调试器 缓存 his 打开 print
表达式在 JavaScript 中是短语(phrases),那么语句(statements)就是 JavaScript 整句或命令,语句以分号结束。表达式计算出一个值,语句用来执行以使某件事情发生
赋值语句、递增/减运算、delete 运算符删除对象属性、函数调用都是表达式语句
1 gretting = "Hello " + name; 2 i *= 3; 3 count++; 4 delete o.x; 5 alert(greeting) 6 window.close(); 7 Math.cos(x) 8 cs = Math.cos(x);
逗号运算符将几个表达式连接在一起形成一个表达式,同样,JavaScript 中还可以将多条语句联合在一起,形成一条复合语句(compound statement)。只须用花括号括起来即可,下面几行代码就可以当成一条单独语句
1 { 2 x = Math.PI; 3 cx = Math.cos(x); 4 console.log("cos(x) = " cx); 5 }
需要注意的两点:
空语句(empty statement)允许包含 0 条语句,空语句在初化一个数组时偶尔会用到
1 var a = Array(50); 2 a // => [undefined,,,,undefined] 3 for (i = 0; i < a.length; a[i++] = 0) ; // 初始化一个数组,注意末尾的分号不能少 4 a // => [0,,,0]
这个循环中,所有操作都在表达式 a[i++]=0 中完成,这里并不需要任何循环体。然而 JavaScript 需要循环体中 至少包含一条语句,因此,这里只使用了一个单独的分号来表示一条空语句
var 和 function 都是声明语句,声明语句本身什么也不做,只用来更好地组织代码的语义
var 语句用来声明一个或者多个变量,用法如下:
1 var name_1 [= value_1] [,..., name_n [= value_n]]
如果 var 语句出现在函数体内,那么它定义的是一个 局部变量,其作用域就是这个函数,如果在顶层代码中使用 var 语句,它声明的是 全局变量,整个程序中都是可用的
全局变量是全局对象的属性。然而通过 var 声明的全局变量 无法 通过 delete 删除
如果 var 语句中的变量没有指定初始化表达式,那么这个变量的值初始为 undefined
函数声明的语句的语法如下:
1 function fun_name([arg1 [, arg2 [..., argn]]]) { 2 statements 3 } 4 5 var f = function(x) { return x+1; }; // 通过 var 声明函数 6 function f(x) { return x+1; }
1 if (expression) { 2 statement 3 }
这种形式中,需要计算 expression 的值,如果结果是真值,那么就执行 statement
为了避免歧义,建议 总是 给 if 语句添加花括号
1 if (expression) { 2 statement 3 } else if (expression) { 4 statement 5 }
1 switch(expression) { 2 statement 3 }
1 var count = 0; 2 while (count < 10) { 3 console.log(count); 4 count++ 5 }
1 function printArray(a) { 2 var len = a.length, i = 0; 3 if (len == 0) { 4 console.log(‘Empty Array); 5 } else { 6 do { 7 console.log(a[i]); 8 } while(++i < len); 9 } 10 }
for 循环的 执行顺序 是:
increment
1 for (initialize; test; increment) { 2 statement 3 }
1 initialize; 2 while(test) { 3 statement 4 increment; 5 }
1 for (variable in object) { 2 statement 3 }
variable 通常是一个变量名(也可以是个表达式),也可以是一个可以产生左值的表达式或者一个通过 var 语句声明的变量,总之必须是一个适用于赋值表达式左侧的值。object 是一个 表达式,这个表达式计算结果是一个对象
在执行 for/in 语句的过程中,JavaScript 解释器首先计算 object 表达式。如果表达式为 null 或者 undefined,解释器将会跳过循环并执行后续代码(ECMAScript 3 可能会抛出一个类型错误异常)。如果表达式等于一个原始值,这个原始值将会转换为与之对应的 包装对象(wrapper object)否则,expression 本身已经是对象了。JavaScript 会依次遍历 可枚举 的对象属性来执行循环体语句
for/in 循环并不会遍历对象的所有属性,只有「可枚举」(emumerable)的属性才会遍历到。JavaScript 语言核心所定义的内置方法就 不是「可枚举的」,比如,所有对象都有方法 toString(),但 for/in 循环并不枚举 toString 这个属性,还有很多内置属性也是不可枚举的(nonenumerable)。而代码中定义的所有属性和方法都是可枚举的
属性枚举的顺序
ECMAScript 规范并没有指定 for/in 循环按照何种顺序来枚举对象属性。但实际上,主流浏览器厂商的 JavaScript 实现是按照 属性定义的先后顺序 来枚举简单对象的属性
JavaScript 中另一类语句是跳转语句(jump statement)。通常有 break, continue, return, throw
语句是可以添加标签的,标签由语句前的标识符和冒号组成:
1 indetifier: statement
标识符必须是一个合法的 JavaScript 标识符
1 mainloop: while(token != null) { 2 // statement 3 continue mainloop; 4 }
单独使用 break 语句的作用是立即退出最内层的 循环 或者 switch 语句,break 关键字后面也可以跟一个语句标签,当 break 和标签一块使用时,程序将跳转到这个标签所标识的语句块的结束
不管 break 语句带不带标签,它的控制权都无法超过函数的边界
类似于 break,但是它不退出循环,而是转而执行下一次循环。continue 语句只能在循环体内使用,其它地方使用会报错
在不同类型的循环中,continue 的行为也是有所区别:
需要注意的是 continue 语句在 while 和 for 循环中的区别,while 循环直接进入一下轮的循环条件判断,但 for 循环首先计算其 increment 表达式,然后判断循环条件,所以 for 循环并不能完全等价模拟出 while 循环
1 // while 语句中的写法会造成死循环,for 语句则不会 2 // for 语句中的 increment 表达式总是会执行到 3 var i = 0; 4 while (i < 10) { 5 if (i < 5 ) { 6 continue; 7 } 8 console.log(i); 9 i++; 10 } 11 12 for (var k = 1; k < 10; k++) { 13 if (k < 5) { 14 continue; 15 } 16 console.log(k); 17 }
1 return expression;
return 语句 只能 出现在函数体内,如果不是的话会报语法错误。当执行到 return 语句的时候,函数终止执行,并返回 expression 的值给调用程序,例如:
1 function square(x) { return x*x; } 2 square(2) // => 4
return 可以单独使用而不必带有 expression,这样的话函数会向调用程序返回 undefined
所谓异常(exception)是当发生了落地生根异常情况或错误时产生的一个信号。抛出异常(throw exception),就是用信号通知发生错误或者异常头部。捕获(catch)异常是指处理这个信号,即采取必要的手段从异常中恢复
1 throw expression;
expression 的值可以是任意类型的。当 JavaScript 解释器抛出异常的时候通常采用 Error 类型和其子类型
1 function factorial(x) { 2 // 如果输出参数是非法的,则抛出一个异常 3 if (x < 0) throw new Error(‘x 不能是负数‘); 4 for (var f = 1; x > 1; f*= x, x--) ; 5 return f; 6 }
当异常招聘时,JavaScript 解释器会 立即停止 当前正在执行的逻辑,并跳转到 就近的 异常处理程序。异常钼是程序是用 try/catch/finally 语句的 catch 从句编写的,JavaScript 会沿着方法的词法结构和调用栈向上传播
try 从句定义了需要处理的异常所有代码块。catch 从句跟在其后,当 try 块内某处发生了异常时,调用 catch 内的代码逻辑。catch 从句后跟随 finally 块,后者中放置清理代码,不管 try 块中是否产生异常,finally 块内的逻辑总是会执行。尽管 catch 和 finally 都是可先的,但 try 从句需要至少二者之一(catch/finally)与之组成完整的语句。
try, catch 和 finally 语句块都 必须 使用花括号括起来,即使只有一条语句
1 try { 2 // 通常来讲,这里的代码会从头执行到尾而不会产生任何问题, 3 // 但有时会招聘一个异常,要么是由 throw 语句直接抛出,要 4 // 么是通过调用一个方法间接抛出异常 5 } catch (e) { 6 // 当且仅当 try 语句块抛出了异常,才会执行这里的代码 7 // 这里可以通过局部变量 e 来警告对 Error 对象或者抛出的其他值的引用 8 // 还可以通过 throw 语句重新抛出异常 9 } finally { 10 // 不管 try 语句是否抛出了异常,这里的逻辑总是会执行,终止 try 语句块的方式有: 11 // 1. 正常终止,执行完语句块的最后一条语句 12 // 2. 通过 break, continue 或 return 语句终止 13 // 3. 抛出一个异常,异常被 catch 从句捕获 14 // 4. 抛出一个异常,异常未被捕获,继续向上传播 15 }
一般来说 JavaScript 使用 try/catch 语句的时候很少使用 finally。通常在一些后端语言 IO 操作中使用 finally 的比较多,比如打开一个文件,出现异常或者正常执行完 try 从句都需要关闭文件句柄
with, debugger 和 use strict
with 语句用于临时扩展作用域链,语法如下:
1 with (object) { 2 statement 3 }
这条语句将 object 添加到 作用域链的头部,然后执行 statement,最后把作用域链恢复到原始状态
严格模式中是禁止使用 with 语句的,并且在非严格模式里也是 不推荐 使用 with 语句的。使用 with 语句的 JavaScript 代码非常难于优化,并且和没有使用 width 语句的代码相比,运行更慢
在对象嵌套层次很深的时候通常会使用 with 语句来简化代码编写。比如:
1 document.forms[0].address.value = ‘a‘ 2 document.forms[0].name.value = ‘b‘ 3 document.forms[0].job.value = ‘c‘ 4 5 // 等价于 6 with (document.forms[0]) { 7 address.value = ‘a‘ 8 name.value = ‘b‘ 9 job.value = ‘c‘ 10 } 11 // 使用 with 语句减少了对象访问前缀,但是仍然可以不使用 with 解决这个问题 12 // 使用变量 f 缓存对象引用 13 var f = document.forms[0]; 14 f.address.value = ‘a‘ 15 f.name.value = ‘b‘ 16 f.job.value = ‘c‘
只有在查找标识符的时候才会用到作用域链,创建新的变量的时候不使用
1 var d = 0; 2 var o = { a: 1, b: 2, c: 3}; 3 4 with(o) { 5 a = 2; 6 d = 1 7 } 8 d // => 1 9 o // => {a: 2, b: 2, c: 3}
debugger 语句通常什么也不做。当调试程序可用并运行的时候,JavaScript 解释器将会(非必需)以调试模式运行。这条语句用来产生一个断点(breakpoint),JavaScript 代码的挂靠会停止在断点的位置,这时可以使用调试器转出当前的变量、调用栈等
ECMAScript 5 中,debugger 语句正式加入到了语言规范里,在此之前注流浏览器厂商基本都已经实惠过了
‘use strict’ 是 ECMAScript 5 引入的一条指定。非常类似语句但不是,区别在于:
使用 ‘use strict’ 指令的目的是说明(脚本或函数中)后续的代码将会解析为严格代码
严格代码以 严格模式 执行,严格模式悠了语言的重要缺陷,并提供健壮的查氏功能和增强的安全机制,和非严格模式的区别如下:
var hasStrictMode = (function() { "use strict"; return this === undefined }())
标签:rip exp 对象引用 注意 调试器 缓存 his 打开 print
原文地址:http://www.cnblogs.com/deveil/p/5995354.html