函數內的代碼在定義時并不會執行,只有在調用時才會執行.
有四種方法可以調用函數:
- 作為函數
- 作為方法
- 作為構造函數
- 通過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()可以用來間接調用函數.