关键字
根据规定,关键字是保留的,不能用作变量名或函数名。
下面是一些ECMAScript关键字的完整列表。
break ,case,catch,continue,default,delete,do,else,finally.
for,function,if,iInstanceof,new,return,switch,this,throw.
try,typeof,var,void,while,with.
条件语句
- 比较运算符
比较运算符执行的是比较运算。每个比较运算符都返回一个布尔值。比较运算符在逻辑语句中使用,以测定变量或值是否相等。
== (等于) === (全等-值和类型) != (不等于)
(大于) < (小于) >= (大于或等于) <= (小于或等于)
- 逻辑运算符
(1)逻辑运算符,用于测定变量或值之间的逻辑。
&& (and) || (or) ! (not)
(2)条件运算符
variablename=(condition)?value1:value2;
如果条件condition满足,则为value1,否则为value2。
(3)if语句
①if语句
if(条件){
只有当 条件为true时执行的代码
};
②if…else if…else语句
if(条件1)
{
当条件1为true时执行的代码
}
else if(条件2)
{
当条件2为true时执行的代码
}
else
{当条件1和条件2都不为true时执行的代码
};
(4)switch语句
switch语句是if语句的兄弟语句。
可以用switch语句为表达式提供一系列的分支情况(case)。
switch(expression)
case value:statement;
break;
case value:statement;
break;
case value:statement;
break;
default:statement;
----------
###**循环语句**
(1)while语句
while(表达式)
{
语句;
}
(2)do...while语句
```do
{
语句;
}while(表达式);
<div class="se-preview-section-delimiter"></div>
do…while为不确定性循环,先执行大括号中的语句,当表达式的结果为真(true)时,执行循环中的语句;当表达式为假(false)不执行循环,并退出do…while循环。
(3)for语句
for(初始化表达式;判断表达式;循环表达式)
{
语句;
}
<div class="se-preview-section-delimiter"></div>
先执行“初始化表达式”,再根据“判断表达式”的结果判断是否执行循环,当判断表达式为真(true)时,执行循环中的语句,最后执行“循环表达式”,并继续返回循环的开始进行新一轮循环;表达式为假(false)时不执行循环,并退出for循环。
(4)break和continue语句
①break与continue说明
break可以跳出switch…case语句,继续执行switch语句后面的内容。break语句还可以跳出循环,也就是结束循环语句的执行。continue语句的作用为结束本次循环,接着进行下一次是否执行循环的判断。
②break和continue的本质区别
continue与break的区别是:break是彻底结束循环,而continue是结束本次循环。
(5)for…in语句
for…in语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。for…in中的代码每执行一次就会对数组的元素或者对象的属性进行一次操作。
for(变量in对象)
{
在此执行代码
};
“变量”用来指定变量,指定的变量可以是数组元素,也可以是对象的属性。
----------
<div class="se-preview-section-delimiter"></div>
##**函数**
> 函数是一组可以随时随地运行的语句,简单的说,函数是完成某个功能的一组语句,它接收0个或者多个参数,然后执行函数体来完成某个功能,最后根据需要返回不返回处理结果。
(1)定义和调用函数
> 函数是可以重复使用的代码块,可以由一个事件执行,或被调用执行。函数是ECMAJavascript的核心。
> 函数是由这样的方式进行声明的:关键字function、函数名、一组参数,以及置于花括号中的待执行代码。
基本语法`
function functionName(arg0,arg1,...argN){
statements
};`
如何调用函数
> 通过其名字加上括号中的参数进行调用。
函数如何返回参数值
> 函数只需要使用return后跟要返回的值即可。
> 如果函数无返回值,那么可以调用没有参数的return,随时退出函数。
(2)用arguments对象访问函数的参数
> Javascript函数并没有严格要求哪些参数是必选参数,哪些参数是可选参数,因此传入的参数个数是允许不等于定义函数时参数的个数的。如果在函数中使用了未定义的参数,则会提示语法错误(参数未定义),Javascript代码不会正常运行,如果参数已经定义,但未正确地传入,相关参数值会以undefined替换,Javascript代码仍正常运行。
<hr/>
<div class="se-preview-section-delimiter"></div>
###函数对象
**因为函数是对象,所以它们可以像任何其他的值一样被使用。函数可以保存在变量、对象和数组中。函数可以被当做参数传递给其他函数,函数也可以再返回函数。而且,因为函数是对象,所以函数可以拥有方法。**
**函数的与众不同在于它们可以被调用。**
<div class="se-preview-section-delimiter"></div>
###函数字面量
函数对象通过函数字面量来创建
<div class="se-preview-section-delimiter"></div>
//创建一个名为add的变量,并用来把两个数字相加的函数赋值给它。
var add = function(a,b){
return a+b;
}
函数字面量包括4个部分。
**第1个部分是保留字function.**
**第2个部分是函数名,可悲省略。**
**函数的第3部分是包围在圆括号中的一组参数。**多个参数用逗号分隔,这些参数将被定义为函数中的变量。它们不像普通的变量那样将被初始化为undefined,而是在该函数被调用时初始化为实际提供的参数的值。
**第4部分是包围在花括号中的语句。这些语句是函数的主体。**
一个内部函数除了可以访问自己的参数和变量,同时它也能自由访问把它嵌套在其中的父函数的参数与变量。通过函数字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为闭包。
<div class="se-preview-section-delimiter"></div>
###调用
调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数。
除了声明时定义的形式参数,每个函数还接收两个附加参数:this和arguments。参数this在面向对象编程非常重要,它的值取决于调用的模式。
**在JS中一共有4种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。**这些模式在如何初始化关键参数this上存在差异。
**调用运算符是跟在任何产生一个函数值的表达式之后的一对圆括号。** 圆括号内可含零个或多个用逗号隔开的表达式。每个表达式产生一个参数值。每个参数值被赋予函数声明时定义的形式参数名。当实际参数(arguments)的个数与形式参数(parameters)的个数不匹配时,不会导致运行时报错。如果实际参数值过多了,超出的参数值会被忽略。如果实际参数值过少,缺失的值会被替换为undefined。**对参数值不会进行类型检查:任何类型的值都可以被传递给任何参数。**
<div class="se-preview-section-delimiter"></div>
###方法调用模式
**当一个函数被保存为对象的一个属性时,我们称它为一个方法。**
当一个方法被调用时,this被绑定到该对象。如果调用表达式包含一个提取属性的动作(即包含一个 . 点表达式或[subscript]下标表达式),那么它就是被当做一个方法来调用。
<div class="se-preview-section-delimiter"></div>
//创建myObject对象。它有一个value属性和一个increment方法。
//incre方法接受一个可选的参数。如果参数不是数字,那么默认使用数字1。
var myObject = {
value : 0,
increment : function(inc){
this.value +=typeof inc ===’number’ ? inc : 1;
}
};
myObject.increment();
document.writeln(myObject.value); // 1
myObject.increment(2);
document.writeln(myObject.value); // 3
方法可以使用this访问自己所属的对象,所以它能从对象中取值或对对象进行修改。
通过this可去的它们所属对象的上下文的方法称为公共方法。
<div class="se-preview-section-delimiter"></div>
###函数调用模式
当一个函数并非一个对象的属性时,那么它就是被当做一个函数来调用的:
<div class="se-preview-section-delimiter"></div>
var sum = add(3,4); // sum=7.
以此模式调用函数时,this被绑定到全局对象。
<div class="se-preview-section-delimiter"></div>
//给myObject增加一个double方法。
myObject.double = function() {
var that = this ;
var helper = function () {
that.value = add(that.value,that.value);
}
helper(); //以函数的形式调用helper。
};
//以方法的形式调用double
myObject.double();
document.writln(myObject.value); //6
<div class="se-preview-section-delimiter"></div>
###构造器调用模式
**JavaScript是一门基于原型继承的语言。**
这意味着对象可以直接从其他对象继承属性,该语言是无类型的。
如果在一个函数前面带上new来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时this会被绑定到那个新对象上。
new前缀也会改变return 语句的行为。
<div class="se-preview-section-delimiter"></div>
// 创建一个名为Quo的构造器函数.它构造一个带有status属性的对象。
var Quo = function (String){
this.status = string;
};
//给Qup的所有实例提供一个名为get_status的公共方法。
Quo.prototype.get_status = function () {
return this.status;
};
//构造一个Quo实例。
var myQuo = new Quo(“confused”);
document.writln(myQuo.get_status()); //打印显示“confused”
**一个函数,如果创建的目的就是希望结合new前缀来调用,那么它就被称为构造器函数。**
<div class="se-preview-section-delimiter"></div>
###Apply调用模式
apply方法让我们构建一个参数数组传递给调用函数。它允许我们选择this的值。apply方法接收两个参数,第1个是要绑定给this的值,第2个就是一个参数数组。
<div class="se-preview-section-delimiter"></div>
//构造一个包含两个数字的数组,并将它们相加。
var array = [3,4];
var sum = add.apply(null,array); //sum=7;
<div class="se-preview-section-delimiter"></div>
###返回
当一个函数被调用时,它从第一个语句开始执行,并在遇到关闭函数的 } 时结束。 然后函数把控制权交还给调用该函数的程序。
return 语句可用来使函数提前返回。当return 被执行时,函数立即返回而不再执行余下的语句。
一个函数总是会返回一个值,如果没有指定返回值,则返回undefined。
如果函数调用时在前面加上了new前缀,且返回值不是一个对象,则返回this(该新对象)。
<div class="se-preview-section-delimiter"></div>
###异常
<div class="se-preview-section-delimiter"></div>
var add= function (a){
if(typeof a!== ‘number’ || typeof b!== ‘number’){
throw {
name:’TypeError’,
message:’add needs numbers’
};
}
return a+b;
}
throw 语句中断函数的执行。它应该抛出一个exceptionb对象,该对象包含一个用来识别异常类型的name属性和一个描述性的message属性。
该exception对象将被传递到一个try语句的catch从句:
<div class="se-preview-section-delimiter"></div>
//构造一个try_it函数,以不正确的方式调用之前的add函数。
var try_id = function () {
try{
add(“seven”);
}catch (e) {
document.writln(e.name+’:’+e.message);
}
}
try_it();
“`
先执行“初始化表达式”,再根据“判断表达式”的结果判断是否执行循环,当判断表达式为真(true)时,执行循环中的语句,最后执行“循环表达式”,并继续返回循环的开始进行新一轮循环;表达式为假(false)时不执行循环,并退出for循环。
(4)break和continue语句
①break与continue说明
> break可以跳出switch...case语句,继续执行switch语句后面的内容。break语句还可以跳出循环,也就是结束循环语句的执行。continue语句的作用为结束本次循环,接着进行下一次是否执行循环的判断。
②break和continue的本质区别
> continue与break的区别是:break是彻底结束循环,而continue是结束本次循环。
(5)for...in语句
for...in语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。for...in中的代码每执行一次就会对数组的元素或者对象的属性进行一次操作。
for(变量in对象)
{
在此执行代码
};
“变量”用来指定变量,指定的变量可以是数组元素,也可以是对象的属性。
//构造一个try_it函数,以不正确的方式调用之前的add函数。
var try_id = function () {
try{
add("seven");
}catch (e) {
document.writln(e.name+':'+e.message);
}
}
try_it();
作用域
var foo = function () {
var a = 3, b = 5;
var bar = function(){
var b = 7, c = 11;
//此时,a为3,b为7,c为11
a +=b+c;
//此时,a为21,b为7,c为11
};
//此时,a为3,b为5,而c还没有定义。
bar();
//此时,a为21,b为5。
};
回调
函数使得不连续事件的处理变得更容易。
例如,假定有这么一个序列,由用户交互行为触发,向服务器发送请求,最终显示服务器的响应。
request = prepare_the_request ();
response = send_request_synchronously(request);
display(response);
这种方式的问题在于,网络上的同步请求将会导致客户端进入假死状态。
如果网络传输或服务器很慢,响应会慢到让人不可接受。
更好的方式是发起异步请求,提供一个当服务器的响应到达时随即触发的回调函数。异步函数立即返回,这样客户端就不会被阻塞。
request = prepare_the_request();
send_request_asynchronously(request,function (response){
display(response);
});