js是基于对象的脚本语言,js代码复用的单位是函数,但它的函数比结构化程序设计语言的函数功能更加丰富。可以这么理解,js语言的函数就是“一等公民”,它可以独立存在。
js定义一个函数会得到如下五项:
1.函数
2.对象:定义函数时,系统也会创建一个对象,该对象是Function类的实例
3.方法:定义函数时,该函数通常会附加给某个对象,作为该对象的方法。在全局下定义是赋给window。
4.变量
5.类:定义函数时,会得到一个和函数同名的类。
定义函数的三种方式:
- 定义命名函数:
命名格式如下:
function functionName(parameter){
statements
}
- 定义匿名函数
命名格式如下: function(parameter){ statements }
注意要在函数体外面加“;”。当通过这种语法格式定义函数之后,实际上就是定义了一个函数对象(即Function实例),接下来就可以将这个对象赋给另一个变量。
- 使用Function类匿名函数
命名格式如下: var f=new Function(a1,a2....,b)
其中a1,a2…是一系列的字符串,代表的是Function类构造器的参数,而最后一个字符串参数b是函数的执行体,执行体的各语句以分号隔开。但函数执行体的语句很多时,这种方式会显得十分臃肿,因此这种方式的可读性不好。
调用函数的三种方式:
- 直接调用函数
这种方式最常见,例如:`p.walk();` - 用call()方法调用函数
直接调用简单、易用,但不灵活。有时候调用函数时需要动态地传入一个函数引用,就需要使用call()方法来调用函数。
其调用格式为:
函数引用.call(调用者,参数1,参数2.....)
这种方式相当于:
调用者.函数(参数1,参数2.....)=函数.call(调用者,参数1,参数2.....)
推荐使用这种方式,因为这种方式可以明显的指出调用者是谁。
- 直接调用函数
- 用apply()方法调用函数
apply()方法与call()方法的功能基本相似,都可以动态地调用函数。
区别在于call()调用函数时,必须在括号中详细地列出每个参数;而apply()调用时,需要以数组的形式一次性传入所有参数
调用格式为: 函数引用.apply(调用者,[参数1,参数2.....])
在同一个script元素中,js允许先调用函数,在定义该函数------这实际上是js的“函数提升”特性。如果将匿名函数赋值给变量,依然会发生函数提升,但此时提升的是被赋值的变量,而不是函数本身。如果变量是全局变量,该匿名函数也是一个全局函数。另外需要注意一点的是,当变量名和函数名同名时,像`var a;function a(){} `时,若变量未赋值,函数覆盖变量;若函数指定了值,变量会覆盖函数。
定义对象的三种方式:
- 使用new关键字调用构造器创建对象
前面提到了在定义函数的时候,系统会创建一个和函数名同名的类,所以可以使用new来创建对象。使用new关键字调用构造器创建对象,这是最接近面向对象语言创建对象的方式
可以参考如下代码:
<script> function person(name,age){ this.name=name; this.age=age; } var p1=new person(); </script>
- 使用new关键字调用构造器创建对象
- 使用Object类创建对象
因为在js中所有的对象都是Object类的子类,因此可以使用如下方式创建对象:
`var myobj=new Object();`这是一个空对象,因为js是动态语言,因此可以动态地为该对象增加属性和方法
可以参考如下代码: <script> var myobj=new Object(); myobj.name="lisi"; myobj.age=23; </script>
- 使用json语法创建对象
利用json创建对象,只需要了解json格式即可:创建对象时,以 { 开头,以 } 结束,每个属性名和属性值之间以 冒号(:)隔开,多个属性定义之间以逗号(,)隔开。但记住:最后一个属性定义后面不能再有逗号(,)。
可以参考如下代码: <script> var p={ name="lisi",age=23 }; </script>