7.JavaScript的语句
语句statement是JavaScript整句或命令,赋值和函数调用这些有副作用的表达式是可以作为单独的语句的,这种把表达式当作语句的用法也叫做表达式语句,类似的还有声明语句,声明新变量或定义新函数
JavaScript解释器是依照语句的编写顺序依次执行,JavaScript中还有很多是可以改变默认顺序的语句和控制结构:
- 条件(conditional)语句,JavaScript解释器可以根据一个表达式的 值来判断是执行还是跳过,比如if或switch
- 循环(loop)语句,可以重复执行语句,比如while和for
- 跳转(jump)语句,可以让解释器跳转至其他部分继续执行,如break,return和throw
表达式语句
具有副作用的表达式是JavaScript中最简单的语句
赋值语句
greeting = "hello" + name;
递增++或递减--,改变一个变量的值,像执行一条赋值语句一样
counter++;
delete运算符的重要作用是删除一个对象的属性,所有他一般作为语句使用
delete o.x;
函数调用
alert(greeting)
复合语句和空语句
使用花括号将多条语句括起来形成一条复合语句
{
x = Math.PI;
cx = Math.cos(x);
console.log("cos(Π) = "+ cx);
}
//语句块不需要分号结尾,但块中的原始语句要分号结尾
空语句是允许包含0条语句的语句
;
if((a == 0)||(b == 0)); //这行语句后面的分号会导致前面的判断语句毫无作用
注意: 空语句一般用;来表示,但当在for循环、while循环或者if语句后面的分号很不起眼,它不是分隔符,而是作为空语句
声明语句
var和function以及后面加入的let,const都是声明语句,它们声明或定义变量或函数,声明语句本身什么也不做,但它可以通过创建变量和函数,可以更好的组织代码语义
var
var语句用来声明一个或多个变量
var name_1 [ = value_1] [,..., name_n [= value_n]]
var 之后跟随的是要声明的变量列表,列表中的每一个变量都可以带有初始化表达式,用于指定它的初始值
var i ;
var j = 0 ;
var p,q;
var greeting = 'hello' + name;
var x = 2.4,y = Math.cos(0.75),r,theta;
var x = 2,y= x * X;
var x = 2,
f = function(x){return x*x},
y = f(x);
如果var出现在函数内,那它定义的是一个局部变量,作用域就是这个函数,如果在顶层中使用var,那么声明的就是全局变量,且无法通过delete删除
function
关键字function用来定义函数,函数定义也可以写成语句形式
var f = function(x){ return x + 1; }
function f(x) {return x +1 }
函数体是JavaScript语句组成,语句数量不限,但必须要用花括号括起来,在定义函数时,并不执行函数体内的语句,它和调用函数时待执行的新函数对象相关联.
函数声明语句和函数定义表达式包含同样的函数名,但二者不同,两种方式虽然都创建了新的函数对象,但函数声明语句中的函数名时是一个变量名,变量名指向函数对象
并且函数声明语句和var一样,会被提前声明,但与var不同的是,函数声明语句会将函数名称和函数体全部提前,也就是说,脚本中的所有函数和函数中所有嵌套的函数都会在当前上下文中其他代码之前声明
条件语句
条件语句是通过判断指定表达式的值来决定是否执行还是跳过语句.
- if语句
if(expression)//为真执行statement,否就不执行
statement
if(expression)
statement1
else
statement2
- else if
- switch
switch(expression){
statements
}
循环语句
- while
while(expression)
statement
- do while
do
statement
while(expression) //意味着至少执行一次
- for
for(initialize;test;increment)
statement
- for/in
for(variable in object)
statement
其他语句
- with
with(object)
statement //这条语句将object添加到作用域链的头部,然后执行statement,最后把作用域链恢复到原始状态
//用于临时拓展作用域链
with(document.forms[0]){
name.value = '';
address.value = '';
email.value = '';
}//避免了每个属性名添加document.forms[0]的前缀
- debugger
function f(0){
if(0 === undefined) debugger
}//这条语句会产生一个断点,此时可以用调试器输出变量的值,检测调用栈
use strict
"use strict"与普通语句有两个重要的区别:
- 它不包含任何语言的关键字,指令仅仅是一个包含一个特殊字符串直接量的表达式,对于那些没实现ES5的JavaScript解释器来说,它只是一条没有副作用的表达式语句
- 它只能出现在脚本代码的最开始或者函数体的开始,任何实体语句之前.但不必在首行
使用"use strict"指令说明后续的代码将会解析为严格代码,严格代码以严格模式执行
- 严格模式禁止使用with语句
- 严格模式中,所有的变量都要先声明,如果给一个未声明的变量,函数,函数参数,catch从句参数或全局对象的属性赋值,将会抛出一个引用错误异常(非严格模式中,这种隐式声明会创建一个全局属性)
- 在严格模式中,调用的函数(不是方法)中的一个this值是undefined(非严格中调用的是this)
- 在严格模式中,当通过call()或apply()调用函数时,其中的this值就是通过call()或apply()传入的第一个参数