关于JavaScript中函数的定义、对象以及对象实例化的理解

时间:2022-03-28 20:23:59

趁近段时间不是很忙,把之前有关JS学习的一些笔记整理了一下:

函数的定义:通俗点来讲,函数是由事件驱动或者它被调用时执行的可重复使用的代码块。在JS中,函数的定义方式通常有以下几种:

(1)function语句(函数声明):

语法:function函数名(参数1,参数2…){函数体}

例:function test(a,b){
                  return(a+b);

}

 

(2)函数表达式,又称函数字面量:

语法:var 变量名=function(参数1,参数2…){函数体}

例:var sum=function(sum1,sum2){

      return(sum1+sum2);

}

注:上式中由于function后面没有函数名,这相当于将一个匿名函数赋予给了一个变量,所以也称为匿名函数。

var sum=function theSum(sum1,sum2){

    return(sum1+sum2);

}alert(theSum(1,2)); //3;

alert(sum(1,2)); //3;

我们可以看到两者的值是一样的,这说明我们可以通过函数名theSum来调用函数,也可以通过匿名函数来调用函数。

 

(3)使用Function构造函数:

语法:var 变量=new Function(”参数1”,”参数2”,…,”函数体”)

例:var add=new Function(“a”,”b”,”returna+b”);

 

几种函数定义方式的比较与区别:

1.无论用哪种方法定义函数,它们都是Function对象的实例,并将继承Function对象所有默认或者自定义的属性和方法。

2.对于函数声明和函数表达式这两种函数定义方式而言,解析器并不是一视同仁的,解析器会优先解析函数声明,并使其在执行任何代码之前可用(可访问);而对于函数表达式,只有当解析器执行到它所在的代码行时。才会被解释和执行:

 例:alert(sum(1,2));// 3

     function sum(a,b){

       return a+b;

}

 例子运行的结果是3,这是为什么呢?这是因为在代码开始执行之前,解析器就已经通过函数提升的过程。而在代码求值时,js引擎在第一遍会声明函数并将其放到源代码树的顶部,即便声明函数在调用函数的后面,所以如果换成等价的函数表达式,则会报错:

 例:alert(sum(1,2));//sum is not a function

     var sum=function(a,b){

          return a+b;

}

3.对于Function构造函数,其实从表达形式上面看,它和函数表达式类似,但是一般用的比较少,原因在于:JS解析器在解析代码时,并非一行行地进行解析和执行的,而是一段段地进行解析和执行,所以在同一段代码里面,解析器总会将函数声明和函数表达式优先提取出来进行解析,只有当解析和执行完之后才会按顺序执行其他的代码,而Function构造函数并非提前执行,而是动态执行,所以每次循环调用时,函数声明和函数表达式被解析执行完之后就不会从头再重新进行编译,而Function每次循环调用时都需要动态编译一次,效率很低。

 

对象:在JS中一切皆为对象,它是一种无序数据的集合。可以从两个层面去理解:

(1)对象是单个实物的抽象:一个人、一辆车可以是对象,一个网页、一个服务器也可以是对象,当实物被抽象成对象的时候,实物之间的关系就变成了对象之间的关系,那么我们就可以模拟现实的情况,对对象进行编程;

(2)对象就好比是一个容器,它里面包含了属性和方法,属性指的对象的状态,方法指的是对象的行为,例如我们把动物抽象成对象,那么属性记录动物的种类,而方法表示动物的某种行为(奔跑、进食等),在JS中,方法就是对象里面的一个函数。

 

对象实例化:要理解这个,我们首先要理解一个概念“类”,所谓类,指的是对象的模版。对象就是类的实例。由前面我们知道,对象是单个实物的抽象,所以通常需要一个模版,表示某一类实物的共同特征,然后对象根据这个模版生成,这个过程就叫做对象实例化。但是在JS中是没有“类”这个概念的,而是用构造函数来作为对象模版的,所谓构造函数,指的就是专门生成对象的函数。