js函式呼叫
本節主要講述 js函式呼叫
隱式函式引數
arguments
this
函式呼叫的4種方式
- 作為一個函式——skulk(),直接被呼叫
- 作為一個方法——ninja.skulk(),關聯在一個物件上,實現面向物件程式設計
- 作為一個建構函式——new Ninja(),例項化一個新的物件
- 通過函式的
apply
或者call
方法——skulk.apply(ninja)
作為函式直接被呼叫
/* 函式定義作為函式被呼叫 */ function ninja() {}; ninja(); /* 函式表示式作為函式被呼叫 */ var samuria = function() {}; samuria(); /* 立即呼叫的函式表示式 */ (function() {})()
函式上下文
- 非嚴格模式:全域性上下文(window物件)
- 嚴格模式:undefined
嚴格模式
作為方法被呼叫
function whatsMyContext() { console.log(this) } whatsMyContext(); var ninja = { getThis: whatsMyContext } ninja.getThis();
作為建構函式被呼叫
/* 建構函式建立一個物件,並在該物件也就是函式上下文新增一個屬性skulk。這個函式再次返回函式的上下文 */ function Ninja(){ this.skula=function(){ return this; }; } /* 通過關鍵字呼叫的建構函式從而建立兩個新物件。 */ var n1=new Ninja(); var n2=new Ninja(); console.log(n1.skula() === n1) console.log(n2.skula() === n2)
使用 new
關鍵字呼叫函式會觸發以下幾個動作
- 建立一個新的空物件
- 該物件作為this引數傳遞給建構函式,從而成為建構函式的上下文
- 新建構函式的物件作為new運算子的返回值
apply和call
function juggle(){ var result=0; for(var i=0;i<arguments.length;i++){ result += arguments[i]; } this.result = result; } var n1=new juggle(); var n2=new juggle(); juggle.call(n1,1,2,3,4,5); juggle.apply(n2,[1,2,3,34]) console.log(n1.result) console.log(n2.result)