函數調用的四種方式


在JavaScript中一共有4種調用模式:

  • 函數調用模式
  • 方法調用模式
  • 構造器調用模式
  • 間接調用模式,通過call()和apply()進行

1. 函數調用模式

 普通函數調用模式,如:

function printProps(o){ …… } printProps({x:1});

在一個調用中,

(1)每個參數表達式計算的結果作為實參傳遞給聲明函數時定義的形參;

(2)this被綁定到全局變量

var myObject = {value:1}; value = 2; myObject.printProps = function(){ var printValue = function(){ console.log(this.value); };
  printValue();
 console.log(this.value); } myObject.printProps();

此時的運行結果是:

2
1

我們注意到,在printValue()函數在執行時,this.value值為2,也就是說,this指向的是全局對象,而不是myObject。

(3)返回值:函數的返回值成為調用表達式的值。I. 如果函數返回是解釋器到達結尾,也就是沒有執行到return XXX的語句。返回值為undefined。 II. 如果函數返回是因為接受器執行到return xxx語句,返回return之后的值。 III. 如果return語句后沒有值,即return,則返回undefined。

2. 方法調用模式

當一個函數被保存為對象的一個屬性時,稱為方法。

(1)參數和返回值的處理與函數調用一致;

(2)調用上下文this為該對象

function printValue(){ console.log(this.value); } var value=1; var myObject = {value:2}; myObject.m = printValue; //作為函數調用
printValue(); //作為方法調用
myObject.m();

 運行結果為:

1
2

我們注意到,當調用printValue時,this綁定的是全局對象,打印全局變量value值1。但是當調用myObject.m()時,this綁定的是方法m所屬的對象Object,所以打印的值為Object.value,即2。

3. 構造器調用模式

如果函數或方法調用之前帶有new關鍵字,它就構成構造函數調用。如:

function F(){……}

var o = new F();

(1)參數處理:一般情況構造器參數處理和函數調用模式一致。但如果構造函數沒用形參,JavaScript構造函數調用語法是允許省略實參列表和圓括號的。

如:下面兩行代碼是等價的。

var o = new Object();
var o = new Object;

(2)函數的調用上下文為新創建的對象。

function Base(value){
  this.value =value;
}
var value =1;
var o = new Base(2);
console.log(value);
console.log(o.value);
Base(3);
console.log(value);
console.log(o.value);

運行結果:

1
2
3
2

I. 第一次調用Base()函數是作為構造函數調用的,此時調用上下文this被綁定到新創建的對象,即o。所以全局變量value值不變,而o新增一個屬性value,值為2;

II. 第二次調用Base()函數是作為普通函數調用的,此時調用上下為this被綁定到全局對象,在瀏覽器中為window。所以全局對象的value值改變為3,而o的屬性值不變。

(3)構造函數通常不使用return關鍵字,返回值就是新對象。而如果構造函數顯示地使用return語句返回一個對象,那么調用表達式值就為這個對象。如果構造函數使用return語句但沒有指定返回值或者返回一個原始值,則忽略返回值,同時使用新對象作為調用結果。

 

  函數調用模式 方法調用模式 構造器調用模式 間接調用模式
實參處理 參數表達式運行結果作為實參傳遞給函數形參 與函數調用模式一致

一般情況,與函數調用模式一致

但如果構造函數沒用形參,JavaScript構造函數調用語法是允許省略實參列表和圓括號的

call()方法使用它自有的實參列表作為函數的實參

apply()方法要求以數組的形式傳入參數

調用上下文 指向全局變量  指向方法所屬的對象 指向新創建的對象 允許顯示的指定調用所需的this值,為call()或apply()中的第一個參數
返回值

I. 沒有執行到return語句,返回undefined

II. 執行到return xxx語句,返回return之后的值

III. retrun后沒有值,返回undefined

 與函數調用模式一致

構造函數通常不使用return關鍵字,返回值就是新對象。

如果構造函數顯示地使用return語句返回一個對象,那么調用表達式值就為這個對象。

如果構造函數使用return語句但沒有指定返回值或者返回一個原始值,則忽略返回值,同時使用新對象作為調用結果。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM