函数内的代码在定义时并不会执行,只有在调用时才会执行.
有四种方法可以调用函数:
- 作为函数
- 作为方法
- 作为构造函数
- 通过call()和apply()间接调用
函数调用
最普通的调用方式
方法调用
如果一个函数是一个对象的属性,这个属性就被成为方法
function sayHello(){
console.log('hello')
}
person = {name:'mike',age:18}
person.sayHello = sayHello
person.sayHello() //hello
- 方法调用和函数调用的一个很大区别是调用上下文(context)不同,方法调用的上下文是它所在的对象,它可以使用this引用对象.但this是关键字,不是变量或属性名,不能直接给this赋值.
function sayHello(){
console.log(this.name+' says:"hello, I\'m '+this.age+' years old"')
}
person = {name:'Mike',age:18}
person.sayHello = sayHello
person.sayHello() //Mike says:"hello, I'm 18 years old"
- 函数调用和其他属性一样,除了通过点来访问,还可以通过方括号来调用,而且方括号内可以是表达式,可以实现一些通过点访问无法完成的功能
function a(){console.log('method a is invoked')}
o = {}
o[3] = a
o[1+2]() // method a is invoked
方法链
当方法的返回值是一个对象,这个对象还可以调用其他方法,这种方法调用序列成为链或者级联,每次调用结果都是另一个表达式的一部分.
当方法没有返回值时,最好直接返回this,这种设计可以进行链式调用的风格编程.
point.setX(x).setY(y).setZ(z) //给三位空间的一个点设计坐标
不要将方法的链式调用和构造函数的链式调用混淆.
如果方法中有嵌套函数,嵌套函数不能从这个方法中访问this,嵌套函数的this还是全局对象.如果需要访问对象,在方法中使用一个变量存储this,再在嵌套函数中使用这个变量.
var o ={
m:function(){
var self = this //将this保存到变量中
console.log(this === o) //true 方法中this即为对象
f()
function f(){
console.log(this === o) //false 嵌套函数中,this不是当前对象
console.log(self === o) //true
}
}
}
构造函数
如果函数调用前有关机子new,它就构成构造函数的调用.构造函数调用和普通调用在实参处理 调用上下文和返回值方面都不同
- 没有参数可以省略括号
var o = new Object
- 构造函数会新创建一个对象并以这个对象作为其上下文,可以使用this引用这个新创建的对象
- 构造函数一般没有return, 构造函数会隐式返回这个新对象的值.
间接调用
在javascript中, 函数也是对象, 它也有自己的方法. 其中的call()和apply()可以用来间接调用函数.